[c#] 파일을 byte []로 변환하는 안정적인 방법
웹에서 다음 코드를 찾았습니다.
private byte [] StreamFile(string filename)
{
FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read);
// Create a byte array of file stream length
byte[] ImageData = new byte[fs.Length];
//Read block of bytes from stream into the byte array
fs.Read(ImageData,0,System.Convert.ToInt32(fs.Length));
//Close the File Stream
fs.Close();
return ImageData; //return the byte data
}
C #에서 파일을 byte []로 변환하는 데 사용할 수있을만큼 신뢰할 수 있습니까? 아니면 더 좋은 방법이 있습니까?
답변
byte[] bytes = System.IO.File.ReadAllBytes(filename);
그게 트릭을해야합니다. ReadAllBytes는 파일을 열고 내용을 새 바이트 배열로 읽은 다음 닫습니다. 해당 방법에 대한 MSDN 페이지 는 다음과 같습니다 .
답변
byte[] bytes = File.ReadAllBytes(filename)
또는 …
var bytes = File.ReadAllBytes(filename)
답변
모두가 이미 말한 것을 반복하지 말고 파일 조작을 위해 다음 치트 시트를 잘 보관하십시오.
System.IO.File.ReadAllBytes(filename);
File.Exists(filename)
Path.Combine(folderName, resOfThePath);
Path.GetFullPath(path); // converts a relative path to absolute one
Path.GetExtension(path);
답변
이 모든 답변은 .ReadAllBytes()
. 비슷한 또 다른 질문이 여기에 제기되었습니다. C #에서 큰 파일을 바이트 배열로 읽는 가장 좋은 방법?
에 관한 게시물 중 하나에 댓글이 작성되었습니다 .ReadAllBytes()
.
File.ReadAllBytes throws OutOfMemoryException with big files (tested with 630 MB file
and it failed) – juanjo.arana Mar 13 '13 at 1:31
나에게 더 나은 접근 방식은 다음과 같은 것입니다 BinaryReader
.
public static byte[] FileToByteArray(string fileName)
{
byte[] fileData = null;
using (FileStream fs = File.OpenRead(fileName))
{
var binaryReader = new BinaryReader(fs);
fileData = binaryReader.ReadBytes((int)fs.Length);
}
return fileData;
}
하지만 그게 나야 …
물론,이 모든 것은 byte[]
일단 읽어 들인 후 처리 할 메모리가 있다고 가정 하고, File.Exists
이 코드를 호출하기 전에 수행 했듯이 계속하기 전에 파일이 있는지 확인 하지 않았습니다 .
답변
일반 버전으로 충분 해 보입니다. 충분히 구체적인 경우 필요에 맞게 수정할 수 있습니다.
또한 파일이 존재하지 않거나 읽을 수없는 것과 같은 예외 및 오류 조건을 테스트합니다.
다음을 수행하여 공간을 절약 할 수도 있습니다.
byte[] bytes = System.IO.File.ReadAllBytes(filename);
답변
다른 사람들은 기본 제공 File.ReadAllBytes
. 기본 제공 방법은 괜찮지 만 위에 게시 한 코드는 두 가지 이유로 취약하다는 점에 주목할 가치가 있습니다.
Stream
입니다IDisposable
– 당신이 배치해야FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read)
파일이 닫혀 있는지 확인하기 위해 사용 절에 초기화합니다. 이렇게하지 않으면 오류가 발생해도 스트림이 열린 상태로 유지되어 파일이 잠긴 상태로 유지되고 나중에 다른 문제가 발생할 수 있음을 의미 할 수 있습니다.fs.Read
요청한 것보다 적은 바이트를 읽을 수 있습니다. 일반적으로 인스턴스 의.Read
메서드는Stream
최소 1 바이트를 읽지 만 요청하는 모든 바이트를 읽을 필요는 없습니다. 모든 바이트를 읽을 때까지 읽기를 재 시도하는 루프를 작성해야합니다. 이 페이지에서는 이에 대해 자세히 설명합니다.