“The process cannot access the file because it is being used by another process” with Images

前端 未结 7 985
梦毁少年i
梦毁少年i 2020-12-04 02:02

I\'ve seen many issues like this that have been solved and the problem was mostly due to streams not being disposed of properly.

My issue is slightly different, here

相关标签:
7条回答
  • 2020-12-04 02:05

    Since File.Create returns the stream i would dispose it properly:

    using(var stream = File.Create(newPath)){}
    File.WriteAllBytes(newPath, item.File);
    

    or you can use the stream to write to the file directly:

    using (FileStream fs = File.Create(newPath))
    {
        fs.Write(item.File, 0, item.File.Length);
    }
    

    or, probably the easiest, use File.WriteAllBytes alone:

    File.WriteAllBytes(newPath, item.File);
    

    Creates a new file, writes the specified byte array to the file, and then closes the file. If the target file already exists, it is overwritten.

    0 讨论(0)
  • 2020-12-04 02:05

    The File.WriteAllBytes creates the file if necessary. You can juts use:

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

    And are you combine path correctly?

    0 讨论(0)
  • 2020-12-04 02:10

    Force the garbage collector to clean.

    GC.Collect();
    
    0 讨论(0)
  • 2020-12-04 02:13

    This is the most specific way to accomplish what you are trying to do:

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

    You also need to fix your logic for creating the path, which I have done in my example above. You were concatenating the newPath over and over again.

    0 讨论(0)
  • 2020-12-04 02:15

    You state that your problem has nothing to do with disposing streams but check this MSDN article:

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

    What does File.Create return? A FileStream!!!!

    And, at the end of the day, why are you using File.Create if File.WriteAllBytes creates a file if this doesn't exist? ;)

    Creates a new file, writes the specified byte array to the file, and then closes the file. If the target file already exists, it is overwritten.

    Check it on MSDN too: http://msdn.microsoft.com/en-us/library/system.io.file.writeallbytes.aspx

    0 讨论(0)
  • 2020-12-04 02:17
    using (FileStream fs = 
    new FileStream(filePath,
        FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    

    Your log may be write locked, so try with FileShare.ReadWrite.

    0 讨论(0)
提交回复
热议问题