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返されますか?FileStream !!!!

そして、結局のところ、ファイルが存在しないのに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

これは、あなたがやろうとしていることを達成するための最も具体的な方法です。

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 に答える
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 に答える
-2

ガベージコレクターを強制的にクリーニングします。

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