2017-07-13 23 views
-2

別のスレッドからディレクトリ内のファイルをいくつか削除しようとしていますが、削除が機能しないことがあります。C#File.Deleteは機能しません

DirectoryInfo dirInfo = new DirectoryInfo(Directory.GetCurrentDirectory()); 
FileInfo[] fileNames = dirInfo.GetFiles("*.*"); 
foreach (FileInfo fileName in fileNames) 
{ 
    string destinationFilename = cncDestinationDirectory + @"\" + dirInfo.Name + @"\" + fileName.Name; 
    if (File.Exists(destinationFilename)) 
     File.Delete(destinationFilename); 

    File.Move(fileName.FullName, destinationFilename); 
} 

私の目標は、私は先のファイルが既に存在する場合File.Moveは動作しません知っているように、ディレクトリ内のいくつかのファイルを移動することですけど。したがって、ファイルが存在するかどうかを確認し、それが真であれば、このファイルを削除して元のファイルに移動します。

また、File.Deleteは、機能の早すぎる終了を引き起こします。 現在のディレクトリは、以前に別のフォルダに設定されているため、実行可能ファイルと同じフォルダではありません。

このエラーを回避するにはどうすればよいですか?そして、まだ目的地のディレクトリにファイルを移動しますか?

+0

「途中で終了しますか」?どういう意味ですか?あなたは例外を取得していますか? – DavidG

+1

私は質問が表示されません... – fredrik

+0

あなたの質問に示唆するように、エラーケースを処理する方法を決定する必要があります。ファイルをチェックしてから削除するまでに、別のプロセスによってファイルが開かれている可能性があります。 File.Deleteの周りで例外をキャッチし、スローされた場合は元のファイルを移動しませんが、移動していないファイルは終了します。あなたはそれについて何もできません。 – Neil

答えて

0

ファイルの読み取り専用属性のため、ファイルへのアクセスが拒否されるという問題があります。

だから、私はすべてのファイルを設定し、次のように通常通りの属性:

DirectoryInfo dirInfo = new DirectoryInfo(Directory.GetCurrentDirectory()); 
FileInfo[] fileNames = dirInfo.GetFiles("*.*"); 
foreach (FileInfo fileName in fileNames) 
{ 
    if (fileName.Extension == ".iso") 
     return; 

    string destinationFilename = cncDestinationDirectory + @"\" + dirInfo.Name + @"\" + fileName.Name; 
    fileName.Attributes = FileAttributes.Normal; 
    if (File.Exists(destinationFilename)) 
    { 
     File.SetAttributes(destinationFilename, FileAttributes.Normal); 
     File.Delete(destinationFilename); 
    } 

    File.Move(fileName.FullName, destinationFilename); 
} 
+0

この問題をどうやって解決しますか?ファイルがR/Oであることを検出し、それに応じて属性を設定するか、スキップしますか、それとも何ですか? – Neil

+0

私はすべてのファイル属性を 'File.SetAttributes(destinationFilename、FileAttributes.Normal);で標準として設定しました; これらのファイルには特別な属性は必要ないので、 – KingOfMazes

1

ご質問のようにエラーケースを処理する方法を決定する必要があります。ファイルをチェックしてから削除するまでに、別のプロセスによってファイルが開かれている可能性があります。 File.Deleteの周りで例外をキャッチし、スローされた場合は元のファイルを移動しませんが、移動していないファイルは終了します。あなたはそれについて何もできません。

DirectoryInfo dirInfo = new DirectoryInfo(Directory.GetCurrentDirectory()); 
FileInfo[] fileNames = dirInfo.GetFiles("*.*"); 
foreach (FileInfo fileName in fileNames) 
{ 
    string destinationFilename = cncDestinationDirectory + @"\" + dirInfo.Name + @"\" + fileName.Name; 
    try 
    { 
     if (File.Exists(destinationFilename)) 
      File.Delete(destinationFilename); 

     File.Move(fileName.FullName, destinationFilename); 
    } 
    catch(IOException exception) 
    { 
     Console.WriteLine($"Can't move file { filename.FullName}"); 
    } 
} 
+0

私はtry-catchステートメントを実装しましたが、例外は発生しません – KingOfMazes

+0

IOExceptionの代わりにExceptionを使用しました。アクセス拒否を取得します。 しかし、ファイルをブロックするアンチウイルスやその他のプロセスはありません。 – KingOfMazes

+1

@KingOfファイルが読み取り専用である可能性があることを告げる.File.SetAttributes(fileName、FileAttributes.Normal);のようにファイル属性をnormalに設定してみてください。 –

関連する問題