私の主な開発の大半はUNIXシステムで行われているので、私はWindowsの世界ではかなり新しいです。顧客からの特定の要求が入ってきて、ダウンロードしたコンテンツのダウンロードフォルダを見て、ドキュメントフォルダに移動するためのWindowsサービスを作成できるかどうかを尋ねました。何らかの理由で、ブラウザ上でデフォルトのダウンロードディレクトリを変更したくない。Cのファイルのダウンロードディレクトリを見るWindowsサービス
お客様に質問した内容を伝えるために、私はそれにショットを付けると考えました。ここに私の試みは次のとおりです。
protected override void OnStart(string[] args)
{
watch();
}
public void OnDebug()
{
OnStart(null);
}
protected override void OnStop()
{
}
String path = null;
private void watch()
{
FileSystemWatcher watcher = new FileSystemWatcher();
string pathUser = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
path = Path.Combine(pathUser, "Downloads");
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}
private void OnChanged(object source, FileSystemEventArgs e)
{
String pUser = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
String directoryName = Path.Combine(pUser, "Documents"); ;
DirectoryInfo dirInfo = new DirectoryInfo(directoryName);
if (dirInfo.Exists == false)
Directory.CreateDirectory(directoryName);
List<String> MyFiles = Directory
.GetFiles(path, "*.*", SearchOption.AllDirectories).ToList();
foreach (string file in MyFiles)
{
FileInfo mFile = new FileInfo(file);
// to remove name collusion
if (new FileInfo(dirInfo + "\\" + mFile.Name).Exists == false)
mFile.MoveTo(dirInfo + "\\" + mFile.Name);
}
}
私はデバッグモードで自分のコードをテストし、サービスが実行されていると私は、ファイルをダウンロードするために行くとき、ダウンロードに失敗しました。 Visual Studioは、このエラーをポップアップ表示:
mFile.MoveTo(dirInfo + "\\" + mFile.Name);
がどのように私はこの問題を解決することができます
"An unhandled exception of type 'System.IO.IOException' occurred in mscorlib.dll Additional information: The process cannot access the file because it is being used by another process."
エラーがで投げていますか?
ファイルを移動する前にロックを取得しないでください。ファイルがまだダウンロードされていても、終了するまで待つことができます。移動すると、もちろん失敗したファイルを試してperfを改善できます最初の試みの後で、それらをロックするだけです。最初にtry/catchでラップする必要があります。 – loneshark99
@ loneshark99あなたの記述が理にかなっていますが、私はC#になじみがありません。私はちょうどtry/catch条件を追加しました。あなたはロックを詳しく教えていただけますか? – btald1331
また、Windowsサービスが本当に必要ですか?定期的な時間間隔でスケジュールされたジョブとしてrobocopyと同期を使用するだけで済みます – loneshark99