11

我已经看到很多这样的问题已经解决了,问题主要是由于没有正确处理流。

我的问题略有不同,这里遵循代码片段

 foreach (Images item in ListOfImages)
 {
      newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension);
      File.Create(newPath);

      File.WriteAllBytes(newPath, item.File);
 }

Images自定义结构在哪里?item.File是原始数据,byte[]。

我的问题是在WriteAllBytes调用的那一行,抛出了一个异常。消息内容如下:

The process cannot access the file because it is being used by another process

同样,我不知道我将如何以某种方式close完成这个过程。

4

7 回答 7

23

由于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);

创建一个新文件,将指定的字节数组写入文件,然后关闭文件。如果目标文件已存在,则将其覆盖。

于 2012-11-11T20:58:12.443 回答
5

您声明您的问题与处理流无关,但请查看此 MSDN 文章:

http://msdn.microsoft.com/en-us/library/d62kzs03.aspx

返回什么File.Create?一个文件流!!!!

而且,归根结底,如果文件不存在,您为什么要使用File.Createif创建文件?File.WriteAllBytes;)

创建一个新文件,将指定的字节数组写入文件,然后关闭文件。如果目标文件已存在,则将其覆盖。

在 MSDN 上也检查一下:http: //msdn.microsoft.com/en-us/library/system.io.file.writeallbytes.aspx

于 2012-11-11T20:58:07.970 回答
2
using (FileStream fs = 
new FileStream(filePath,
    FileMode.Open, FileAccess.Read, FileShare.ReadWrite))

您的日志可能被写锁定,因此请尝试使用 FileShare.ReadWrite。

于 2013-09-13T11:45:37.907 回答
1

create 方法打开文件进行写入,并返回一个 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);
                }
于 2012-11-11T21:01:54.090 回答
0

File.WriteAllBytes如有必要,将创建文件。你可以使用:

foreach (Images item in ListOfImages)
{
    newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension);
    File.WriteAllBytes(newPath, item.File);
}

你是否正确组合路径?

于 2012-11-11T21:02:53.583 回答
0

这是完成您正在尝试做的事情的最具体方法:

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

您还需要修复创建路径的逻辑,正如我在上面的示例中所做的那样。您一遍又一遍地连接 newPath 。

于 2012-11-11T23:28:06.910 回答
-2

强制垃圾收集器清理。

GC.Collect();
于 2016-05-06T10:11:17.303 回答