JHN*_*JHN 6 c# file delete-file
我遇到了一个奇怪的问题(这可能是我缺乏知识),我提出了令人讨厌的代码:
try
{
f.Delete();
fTemp.MoveTo(f.FullName);
Console.WriteLine("INFO: Old file deleted new file moved in > {0}", f.FullName);
}
catch (IOException ex)
{
Console.WriteLine("ERROR: Output file has IO exception > {0}", f.FullName);
Environment.ExitCode = 1;
}
Run Code Online (Sandbox Code Playgroud)
f和fTemp是FileInfo对象.因此,如果我使用代码执行此操作,其中f是在媒体播放器中播放的视频文件,则会抛出异常.这工作正常,如预期的那样.现在,当我关闭媒体播放器时,它会删除文件!?即使我的申请被长期关闭.即使我关闭Visual Studio,当我关闭媒体播放器时,它仍会删除该文件.好像某个回调正在某处设置,以确保文件在某个时刻被删除.这种不受欢迎的行为.但我无法弄清楚究竟出了什么问题......
结果现在:
if (!IsFileLocked(f))
{
try
{
f.Delete();
fTemp.MoveTo(f.FullName);
Console.WriteLine("INFO: Old file deleted new file moved in > {0}", f.FullName);
}
catch (IOException ex)
{
Console.WriteLine("ERROR: Output file has IO exception > {0}", f.FullName);
Environment.ExitCode = 1;
}
catch (UnauthorizedAccessException ex)
{
Environment.ExitCode = 2;
Console.WriteLine("ERROR: Output file is locked > {0}", f.FullName);
}
}
else
{
Environment.ExitCode = 3;
Console.WriteLine("ERROR: Couldn't delete file was locked");
}
Run Code Online (Sandbox Code Playgroud)
我知道我仍然可以在删除和MoveTo之间做得更好,但我现在将采取我的更改,霰弹枪编码.....
您收到此消息是IOException因为该文件无法立即删除或写入。但是,当您致电 时Delete(),似乎正在要求删除该文件。
尽管媒体播放器会在文件打开时阻止文件被删除,但文件关闭时仍会被标记为删除,无论您的程序是否正在运行。因此,当媒体播放器关闭时,文件将被删除。
您可以使用以下代码检查该文件是否正在使用,代码取自此处。使Delete和Copy条件不被锁定,你应该很好。
try
{
if(!IsFileLocked(f))
{
f.Delete();
fTemp.MoveTo(f.FullName);
Console.WriteLine("INFO: Old file deleted new file moved in > {0}", f.FullName);
}
}
protected virtual bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//file is not locked
return false;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
289 次 |
| 最近记录: |