我已经看到了许多已经解决的问题,问题主要是由于流无法正确处理。
我的问题略有不同,这里遵循代码段
foreach (Images item in ListOfImages)
{
newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension);
File.Create(newPath);
File.WriteAllBytes(newPath, item.File);
}
其中Images
是自定义结构,而item.File
是原始数据,字节[]。
我的问题是,在称为WriteAllBytes
的线上,抛出了一个例外。消息读取:
The process cannot access the file because it is being used by another process
再次我不知道如何以某种方式 close
。
,因为 File.Create
返回流,我将正确处理它:
using(var stream = File.Create(newPath)){}
File.WriteAllBytes(newPath, item.File);
或者您可以使用流直接写入文件:
using (FileStream fs = File.Create(newPath))
{
fs.Write(item.File, 0, item.File.Length);
}
或最简单的是,单独使用File.WriteAllBytes
:
File.WriteAllBytes(newPath, item.File);
创建一个新文件,将指定的字节数组写入文件,然后 然后关闭文件。如果目标文件已经存在,那是 覆盖。
您声明您的问题与处置流无关,但请检查此MSDN文章:
http://msdn.microsoft.com/en-us/library/d62kzs03.aspx
File.Create
返回什么?文件stream !!!!
,在一天结束时,如果File.WriteAllBytes
创建文件(如果不存在),为什么使用File.Create
?;)
创建一个新文件,将指定的字节数组写入文件,然后 然后关闭文件。如果目标文件已经存在,那是 覆盖。
也在MSDN上检查它:http://msdn.microsoft.com/en-us/library/system.io.file.writeallbytes.aspx
using (FileStream fs =
new FileStream(filePath,
FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
您的日志可能会锁定,因此请尝试使用FileShare.ReadWrite。
创建方法打开编写文件,并返回fileStream对象供您使用。仅仅因为您没有引用它并不意味着它不需要返回。
foreach (Images item in ListOfImages)
{
newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension);
FileStream f = File.Create(newPath);
f.Write(item.File, 0, item.File.Length);
}
File.WriteAllBytes
必要时会创建文件。您可以使用:
foreach (Images item in ListOfImages)
{
newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension);
File.WriteAllBytes(newPath, item.File);
}
您是否正确组合了路径?
这是完成您要做的事情的最具体方法:
foreach (Images item in ListOfImages)
{
using (System.IO.FileStream output = new System.IO.FileStream(Path.Combine(newPath, item.ImageName + item.ImageExtension),
System.IO.FileMode.Create, System.IO.FileAccess.Write))
{
output.Write(item.File, 0, item.File.Length);
output.Flush();
output.Close();
}
}
您还需要修复逻辑以创建路径,这是我在上面示例中所做的。您一遍又一遍地连接新路径。
迫使垃圾收集器清洁。
GC.Collect();