将文件转换为字节的可靠方法
我在网上find了以下代码:
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打开文件,将其内容读入一个新的字节数组,然后closures它。 这是该方法的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);
作为一个通用版本看起来不错。 如果他们足够具体,您可以修改它以满足您的需求。
还可以testingexception和错误情况,如文件不存在或不能被读取等。
您还可以执行以下操作来节省一些空间:
byte[] bytes = System.IO.File.ReadAllBytes(filename);
其他人已经注意到,你可以使用内置的File.ReadAllBytes
。 内置的方法是好的,但值得注意的是,你上面发布的代码是脆弱的,有两个原因:
-
Stream
是IDisposable
– 您应该将FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read)
初始化放在using子句中以确保文件已closures。 不这样做可能意味着如果发生故障,stream将保持打开状态,这将意味着文件保持locking状态 – 这可能会在以后导致其他问题。 -
fs.Read
可能会读取比您请求更less的字节。 一般情况下,Stream
实例的.Read
方法将读取至less一个字节,但不一定要求所有字节。 您需要编写一个循环,重试读取,直到读取所有字节。 本页面更详细地解释了这一点。
所有这些答案与.ReadAllBytes()
。 另一个,类似的(我不会说重复,因为他们试图重构他们的代码)问题是在这里问: 最好的方式来读取一个大的文件到C#中的字节数组?
对其中一个关于.ReadAllBytes()
的post发表了.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 = new File.OpenRead(fileName)) { var binaryReader = new BinaryReader(fs); fileData = binaryReader.ReadBytes((int)fs.Length); } return fileData; }
但是那只是我…
当然,这一切都假定你有内存来处理byte[]
一旦它被读入,我没有把File.Exists
检查,以确保文件在那里继续之前。