Beispiel #1
0
        /// <summary>
        /// 문자열을 스트림 (<see cref="System.IO.MemoryStream"/>)의 인스턴스로 변환한다.
        /// </summary>												
        /// <param name="s">대상 문자열</param>
        /// <param name="enc">인코딩 형식</param>
        /// <returns>변환된 Stream 인스턴스 객체</returns>
        /// <remarks>사용하고 난 Stream 인스턴스 객체는 Close()를 호출하여 메모리에서 제거해야 한다.</remarks>
        public static Stream ToStream(this string s, Encoding enc) {
            enc.ShouldNotBeNull("enc");

            if(s.IsNull())
                return new MemoryStream();

            var stream = new MemoryStream(s.Length * 2);
            var writer = new StreamWriter(stream, enc, 1024);

            writer.Write(s);
            writer.Flush();
            stream.SetStreamPosition();

            return stream;
        }
Beispiel #2
0
        /// <summary>
        /// 지정한 경로의 파일 내용을 비동기적으로 모두 읽어 문자열로 반환하는 Task를 빌드합니다.
        /// </summary>
        /// <param name="path">읽을 파일 전체경로</param>
        /// <param name="encoding">파일 내용 인코딩 방식</param>
        /// <returns>파일 내용을 문자열로 반환하는 작업</returns>
        public static Task<string> ReadAllText(string path, Encoding encoding = null) {
            path.ShouldNotBeWhiteSpace("path");
            encoding.ShouldNotBeNull("encoding");

            encoding = encoding ?? Encoding.UTF8;

            if(IsDebugEnabled)
                log.Debug("파일 내용을 비동기적으로 모두 읽어, 반환하는 작업을 빌드합니다. path=[{0}], encoding=[{1}]", path, encoding);

            var fileStream = OpenRead(path);
            fileStream.ShouldNotBeNull("fileStream");

            var builder = new StringBuilder();

            // 실제 파일 내용을 읽는 작업
            var asyncRead = fileStream.ReadBufferAsync(BufferSize,
                                                       (buffer, count) => builder.Append(encoding.GetString(buffer, 0, count)));

            // 파일을 비동기적으로 다 읽고 나서, 파일 Stream을 닫는 후처리 작업을 지정하고 반환한다.
            //
            var closedFileTask =
                asyncRead.ContinueWith(antecedent => {
                                           if(IsDebugEnabled)
                                               log.Debug("비동기적으로 파일을 모두 읽었습니다... FileStream을 닫습니다... file=[{0}]", path);

                                           var ex = antecedent.Exception;

                                           With.TryAction(() => {
                                                              if(fileStream != null)
                                                                  fileStream.Close();
                                                          });

                                           if(ex != null)
                                               throw ex;

                                           return builder.ToString();
                                       },
                                       TaskContinuationOptions.ExecuteSynchronously);

            return closedFileTask;
        }
Beispiel #3
0
        /// <summary>
        /// 일반 문자열을 Base64 문자열로 만든다.
        /// </summary>
        /// <param name="s"></param>
        /// <param name="enc"></param>
        /// <returns></returns>
        public static string Base64Encode(this string s, Encoding enc) {
            if(IsEmpty(s))
                return string.Empty;

            enc.ShouldNotBeNull("enc");

            return Base64Encode(ToBytes(s, enc));
        }
Beispiel #4
0
 /// <summary>
 /// 문자열을 주어진 인코딩 방식을 이용하여 Byte Array로 변환한다.
 /// </summary>
 /// <param name="s">변환할 문자열</param>
 /// <param name="enc">인코딩 방식</param>
 /// <returns>변환된 바이트 배열</returns>
 public static byte[] ToBytes(this string s, Encoding enc) {
     enc.ShouldNotBeNull("enc");
     return enc.GetBytes(s);
 }
Beispiel #5
0
        public static string ToTextUnsafe(this sbyte[] bytes, Encoding encoding) {
            bytes.ShouldNotBeNull("bytes");
            encoding.ShouldNotBeNull("encoding");

            if(bytes.Length == 0)
                return string.Empty;

            unsafe {
                fixed(sbyte* fixedPtr = bytes)
                    return new string(fixedPtr, 0, bytes.Length, encoding);
            }
        }
Beispiel #6
0
        /// <summary>
        /// 지정된 인코딩 방식으로 주어진 범위의 Byte 배열을 문자열로 변환한다.
        /// </summary>
        /// <param name="bytes">원본 바이트 배열</param>
        /// <param name="enc">인코딩 방식</param>
        /// <param name="index">시작 위치</param>
        /// <param name="count">변환할 갯수</param>
        /// <returns>변환된 문자열</returns>
        public static string ToText(this byte[] bytes, int index, int count, Encoding enc) {
            if(bytes == null || bytes.Length == 0)
                return string.Empty;

            enc.ShouldNotBeNull("enc");

            return enc.GetString(bytes, index, count).TrimEnd(NullTerminatorChar);
        }
Beispiel #7
0
        /// <summary>
        /// 주어진 Stream 내용을 지정된 인코딩 방식으로 문자열로 변환한다.
        /// </summary>
        /// <param name="stream">문자열로 바꿀 스트림</param>
        /// <param name="enc">인코딩 방식</param>
        /// <returns>변환된 문자열</returns>
        public static string ToText(this Stream stream, Encoding enc) {
            stream.ShouldNotBeNull("stream");
            enc.ShouldNotBeNull("enc");

            stream.SetStreamPosition();
            var reader = new StreamReader(stream, enc);
            return reader.ReadToEnd().TrimEnd(NullTerminatorChar);
        }
Beispiel #8
0
        public static string ToText(this string s, Encoding enc) {
            if(IsEmpty(s))
                return string.Empty;

            enc.ShouldNotBeNull("enc");

            using(var stream = ToStream(s, enc)) {
                stream.SetStreamPosition();
                return ToText(stream);
            }
        }