3

ファイルが現在実行されているネットワーク ディレクトリからファイルをコピーする必要があるアプリケーションを作成しています。

でファイルを開こうとしました

using (var source = new FileStream(fileData.FileName, 
                                   FileMode.Open, 
                                   FileAccess.Read, 
                                   FileShare.ReadWrite))

ファイル ストリームを開いた後、別のストリームを作成してコピーします。

ただし、これにより、ファイルが別のプロセスによって使用されているという例外がスローされます。この問題を回避する方法がわかりません。ファイルエクスプローラーを使用するだけで、ファイルが正常にコピーされます。だから私はそれが可能であることを知っていますが、方法がわかりません。

編集:私も簡単File.Copy(source, destination)に試してみましたが、ファイルが別のプロセスで使用されているという同じ例外が発生します。

4

1 に答える 1

0

別のプロセスで使用されているファイルをコピーするには、Windows で 2 つのサービスを利用する必要があり、これらのサービスが無効になっていないことを確認する必要があります。

  • ボリューム シャドウ コピー
  • Microsoft ソフトウェア シャドウ コピー プロバイダー

これらは手動スタートアップのままにしておくことができるため、常に実行する必要はありません。

このために、サードパーティのツールを使用できます。Hobocopyもその 1 つです。必要に応じて 2 つのサービスが自動的に開始され、完了後にボリューム シャドウ コピー サービスがオフに戻ります。

ダウンロードリンク: https://github.com/candera/hobocopy/downloads

ファイルを解凍し、プロジェクトの Lib ディレクトリに配置します。次に、System.Diagnostics.Processを使用してプロセスを呼び出します。あなたの場合、次のスイッチを引数として使用してください: /y (プロンプトを表示せず、すべてをコピーするだけです)

コマンドライン構文:

hobocopy [/statefile=FILE] [/verbosity=LEVEL] [ /full | /incremental ]
     [ /clear ] [ /skipdenied ] [ /y ] [ /simulate ] [/recursive]
     src dest [file [file [ ... ] ]

C# コード:

Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = @"Lib\hobocopy.exe";
process.StartInfo.Arguments = @" /y <network-directory> <local-directory> <filename>";
process.Start();

これにより、使用中または未使用のファイルがコピーされます (hobocopy は、主にディレクトリを効率的にコピーすることに重点を置いています)。

于 2013-05-19T08:47:15.610 に答える