CopyTo
앱을 사용하는 시스템이 .NET 4.0 이상으로 업그레이드되지 않았을 수있는을 사용하여 모든 답변을 얻지 못했습니다. 사람들이 사람들을 업그레이드하도록 강요하고 싶지만 호환성도 좋습니다.
또 다른 것은 스트림을 사용하여 처음에 다른 스트림에서 복사하지 않습니다. 왜 안 해?
byte[] bytes = myOtherObject.InputStream.ToArray();
바이트가 있으면 쉽게 파일에 쓸 수 있습니다.
public static void WriteFile(string fileName, byte[] bytes)
{
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (!path.EndsWith(@"\")) path += @"\";
if (File.Exists(Path.Combine(path, fileName)))
File.Delete(Path.Combine(path, fileName));
using (FileStream fs = new FileStream(Path.Combine(path, fileName), FileMode.CreateNew, FileAccess.Write))
{
fs.Write(bytes, 0, (int)bytes.Length);
//fs.Close();
}
}
이 코드는 .jpg
파일로 테스트 한대로 작동 하지만 작은 파일 (1MB 미만)에서만 사용했음을 인정합니다. 하나의 스트림, 스트림 간 복사, 인코딩 불필요, 바이트 쓰기! 와 오버 복잡한 것들에 대한 필요가 없습니다 StreamReader
당신은 이미 당신이 변환 할 수있는 스트림이있는 경우 bytes
직접와를 .ToArray()
!
이 방법으로 볼 수있는 잠재적 인 단점은 큰 파일이 있고 스트림으로 사용 .CopyTo()
하고 동등한 FileStream
것을 사용하면 바이트 배열을 사용하고 바이트를 하나씩 읽는 대신 스트리밍 할 수 있다는 것입니다. 결과적으로이 방법으로 수행하는 것이 느려질 수 있습니다. 그러나 바이트를 작성 .Write()
하는 FileStream
핸들 의 메소드가 한 번에 한 바이트 만 수행하므로 질식 해서는 안되므로 스트림을 a로 유지하기에 충분한 메모리가 있어야byte[]
한다는 것을 제외하고는 메모리를 방해하지 않습니다 . 객체 . 이것을 사용하고을 얻는 상황에서 OracleBlob
에 가야했습니다. byte[]
충분히 작아서 어쨌든 나에게 사용할 수있는 스트리밍이 없었기 때문에 위의 함수에 바이트를 보냈습니다.
스트림을 사용하는 또 다른 옵션 CopyStream
은 다른 게시물에 있던 Jon Skeet의 기능 과 함께 사용 FileStream
하는 것입니다. 입력 스트림을 가져 와서 직접 파일을 만드는 데 사용 됩니다. File.Create
그가했던 것처럼을 사용하지 않습니다 (처음에는 나에게 문제가 된 것처럼 보였지만 나중에 VS 버그 일 가능성이 있음을 발견했습니다 ...).
/// <summary>
/// Copies the contents of input to output. Doesn't close either stream.
/// </summary>
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[8 * 1024];
int len;
while ( (len = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, len);
}
}
public static void WriteFile(string fileName, Stream inputStream)
{
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (!path.EndsWith(@"\")) path += @"\";
if (File.Exists(Path.Combine(path, fileName)))
File.Delete(Path.Combine(path, fileName));
using (FileStream fs = new FileStream(Path.Combine(path, fileName), FileMode.CreateNew, FileAccess.Write)
{
CopyStream(inputStream, fs);
}
inputStream.Close();
inputStream.Flush();
}