2016-09-15 8 views
1

フォルダから読み込み中に、指定したファイルを内部から削除しようとしています。 私はこの問題を一度も起こすことができません。 しかし、これを初めて実行した後、私はもはや新しいファイルを作成することができません。古いファイルは削除されますが、新しいファイルは必要に応じて作成されなくなります。私の質問は、提供されたコードから、なぜタスクは一度は動作しますが、その後は動作しませんか?最初から削除されていますが、再作成はしません。ファイルが一度作成されてから停止します。

編集: 問題は権限にあります。 私はフォルダのセキュリティ設定を読み書きができるように変更しました。今私が望むようにできるようになりました。 しかし、他のユーザーがそうする方法を知らないため、可能であればセキュリティ設定を自動的に設定する必要があります。

if (Directory.Exists(path1)) 
{ 
    if (File.Exists(path1 + "\\launchinfo.txt")) 
    { 
     File.Delete(path1 + "\\launchinfo.txt"); 
     using (FileStream fs = File.Create(path1 + "\\launchinfo.txt")) 
     { 
      Byte[] info = new UTF8Encoding(true).GetBytes("[Connection]\n" + Form1.ipaddress + "\nport=0000\nclient_port=0\n[Details]\n" + Form1.playername); 
      fs.Write(info, 0, info.Length); 
     } 
    } 
    else 
    { 
     using (FileStream fs = File.Create(path1 + "\\launchinfo.txt")) 
     { 
      Byte[] info = new UTF8Encoding(true).GetBytes("[Connection]\n" + Form1.ipaddress + "\nport=0000\nclient_port=0\n[Details]\n" + Form1.playername); 
      fs.Write(info, 0, info.Length); 
     } 
    } 
} 
+3

で使用されているかどうかを確認する方法は常にPath.Combineを使用してください。パスを連結しないでください。 – Ben

+0

[なぜ非同期ファイルが削除されないのですか?](http://stackoverflow.com/questions/10606328/why-isnt-there-an-asynchronous-file-delete-in-net) –

+0

'File.Delete()'は、Windows API ['DeleteFile()'](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363915(v=vs.85).aspx)を呼び出します。 ) 関数。これはブロッキングコールです。 –

答えて

2

実行中の可能性のある例外は投稿していません。実行している可能性がある例外は投稿していません。投稿してください。

つまり、ファイルを削除しようとすると、特にファイルを作成した後に関数を呼び出すときに、File in use by another processが発生する可能性があります。

これを回避する方法は、プロセスが削除しようとする前にファイルを使用しているかどうかを確認することです。

string fullPath = Path.Combine(path1, "launchinfo.txt"); 
if (Directory.Exists(path1)) 
{ 
     if (File.Exists(fullPath)) 
     { 
     // Call a method to check if the file is in use.   
     if (IsFileLocked(new FileInfo(fullPath)){ 
      // do something else because you can't delete the file 
     } else { 
      File.Delete(fullPath); 
      } 
     } 

     using (FileStream fs = File.Create(fullPath)) 
     { 
     Byte[] info = new UTF8Encoding(true).GetBytes("[Connection]\n" + Form1.ipaddress + "\nport=0000\nclient_port=0\n[Details]\n" + Form1.playername); 
     fs.Write(info, 0, info.Length); 
     } 
} 

ファイルが別のプロセス

protected virtual bool IsFileLocked(FileInfo file) 
    { 
     FileStream stream = null; 

     try 
     { 
      stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None); 
     } 
     catch (IOException) 
     { 
      return true; 
     } 
     finally 
     { 
      if (stream != null) 
       stream.Close(); 
     }  
     //file is not locked 
     return false; 
    } 
+0

ロックされているファイルに対して例外が発生していません ディレクトリ内に新しい.txtがまだ作成されていません – Lynnstrum

+0

これをデバッガで実行しましたか?あなたが問題を特定するのに役立つ情報がたくさんあります。ファイルを取得するための接続はどうですか?これは失敗ですか? – Darren

+0

@ Darren53私はファイルのアクセス権を変更した後に動作するようにしましたが、自動的にパスに新しいファイルを書き込めるようにするにはどうすればよいですか? – Lynnstrum

関連する問題