1

私はこのサイトでこの質問の複数のバージョンを見ましたが、私の正確な問題に対処しているようには見えないので、ここにあります:

を使用してファイルをコピーしようとしていますSystem.Copy。宛先が存在する場合は、上書きする必要があります。私は約1か月間、問題なく1行のコードを使用していました。

IO.File.Copy(SourceFile, DestFile, True)

しかし、問題は約1週間前、より高度なチェックを開始したときに始まりました。部分的にロックされたファイルはコピーに失敗し宛先は削除されます。一方、ロックされたファイルは正しく機能します。使用中のファイルの例外をトリガーするだけです。

そこで、コピーを起動する前に次の行を追加しました。

Using TestForAccess As New IO.FileStream(SourceFile, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)  : End Using

これは、ファイルが使用中の場合にエラーを起動するはずでした。しかし、それは敏感です。一部のファイル(thunderbirdのabook.mabなど)は、この追加されたコードでエラーをトリガーしますが、以前は正常にコピーされていました(エクスプローラーでコピーできます)。

私の質問は基本的に次のとおりです。システムにどのように伝えるか:可能であればコピーsourceする。destinationそうでなければ、壊れないのdestinationですか?

あなたの助けに感謝します、このことは私を狂わせています。

4

3 に答える 3

1

2段階のプロセスを使用します。一時ファイルにコピーしてから、宛先に名前を変更します。そうすれば、コピーが失敗した場合でも、宛先ファイルが上書きされることはありません。

さらに良いことに、あなたは4つのステップです。tempにコピーし、destの名前を他のtempに変更し、tempの名前をdestに変更し、他のtempを削除します。

私のVBは錆びていますが、次のようなものです。

Dim DestTemp As String = DestFile + ".temp"
Dim DestBack As String = DestFile + ".bak"
File.Copy(SourceFile, DestTemp, True)
File.Move(DestFile, DestBack)
File.Move(DestTemp, DestFile)
File.Delete(DestBack)
于 2011-03-30T16:41:37.983 に答える
0

IO.FileShare.None を使用しているためと思われます。

これは、ファイルを追加のスレッドで共有できないことを意味します。コピーは通常 READ 共有モードでファイルを開くため、ファイルは既に開いているため、コピーは機能しますが失敗します。

代わりに IO.FileShare.Read を試すことができます。

于 2011-03-30T17:43:49.380 に答える
-1

コードをtry/catchブロックでラップする必要があります。

C#で使用-例外タイプをIOExceptionに置き換えることができます

FileStream fileStream = null;  
try 
{     
fileStream = new FileStream(@"c:\file.txt", FileMode.Open, FileAccess.Write); 
} 
catch (UnauthorizedAccessException e) 
{
} 
finally 
{     
if (fileStream != null)         
fileStream.Close (); 
} 
于 2011-03-30T16:22:23.517 に答える