/// <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; }
/// <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; }
/// <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)); }
/// <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); }
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); } }
/// <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); }
/// <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); }
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); } }