即使关闭调用应用程序,删除功能也会删除

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之间做得更好,但我现在将采取我的更改,霰弹枪编码.....

Rob*_*man 3

您收到此消息是IOException因为该文件无法立即删除或写入。但是,当您致电 时Delete(),似乎正在要求删除该文件。

尽管媒体播放器会在文件打开时阻止文件被删除,但文件关闭时仍会被标记为删除,无论您的程序是否正在运行。因此,当媒体播放器关闭时,文件将被删除。

您可以使用以下代码检查该文件是否正在使用,代码取自此处。使DeleteCopy条件不被锁定,你应该很好。

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)