2016-08-28 6 views
0

私の主な開発の大半は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."

エラーがで投げていますか?

+0

ファイルを移動する前にロックを取得しないでください。ファイルがまだダウンロードされていても、終了するまで待つことができます。移動すると、もちろん失敗したファイルを試してperfを改善できます最初の試みの後で、それらをロックするだけです。最初にtry/catchでラップする必要があります。 – loneshark99

+0

@ loneshark99あなたの記述が理にかなっていますが、私はC#になじみがありません。私はちょうどtry/catch条件を追加しました。あなたはロックを詳しく教えていただけますか? – btald1331

+0

また、Windowsサービスが本当に必要ですか?定期的な時間間隔でスケジュールされたジョブとしてrobocopyと同期を使用するだけで済みます – loneshark99

答えて

0

ダウンロードが開始され、ダウンロードストリームの受信を開始するダウンロードフォルダに一時ファイルが作成されます。ただし、一時ファイルが作成されるとすぐに、ムーバーアプリケーションは、ダウンロードクライアントがまだそのファイルに書き込んでいるため、別のプロセスによって明らかにロックされているファイルを傍受して移動しようとします。 おそらく、ファイルサイズとともにダウンロードフォルダにファイルのリストをキャッシュし、移動する前にサイズが変更されていないことを確認するためにチェックすることができます。また、ダウンロードに関連する既知の拡張機能を除外することもできます。例えば。 * .temp、* .downloading ユーザーがいつでもファイルをロックできるライブファイルシステムを扱っているので、ロックされたファイルの例外をもう少しうまく処理することもできます。

関連する問題