C#如何检测文件是否已经写完

5

我正在编写一个 PowerPoint 插件,用于将转换为 WMV 格式的文件上传到 FTP。

我有以下代码,它可以正常工作:

oPres.CreateVideo(exportName);
oPres.SaveAs(String.Format(exportPath, exportName),PowerPoint.PpSaveAsFileType.ppSaveAsWMV,MsoTriState.msoCTrue);

但这会启动PP内部的文件转换过程,它会在文件完成写入之前立即执行下一行代码。

有没有办法检测文件何时完成写入,以便我可以运行下一行代码,并知道文件已经完成?


CreateVideo是什么?我猜它会将工作分配到线程中,这就是为什么你的代码会立即转移到下一行的原因? - DonBoitnott
@DonBoitnott 老实说,我不太确定。代码中的任何一行都可能启动转换过程。有没有办法监控这些线程何时完成? - Trevor Daniel
1
可能是重复的问题:有没有办法检查文件是否正在使用? - DonBoitnott
@TrevorDaniel “有没有一种方法可以监视这些线程何时完成?” 请阅读有关Thread.Join()的内容。 - VladL
1个回答

13

当一个文件正在被使用时,它是不可用的,因此您可以检查其可用性并等待直到该文件可供使用。以下是一个示例:

    void AwaitFile()
    {
        //Your File
        var file  = new FileInfo("yourFile");

        //While File is not accesable because of writing process
        while (IsFileLocked(file)) { }

        //File is available here

    }

    /// <summary>
    /// Code by ChrisW -> https://dev59.com/XnNA5IYBdhLWcg3wpvtg
    /// </summary>
    protected virtual bool IsFileLocked(FileInfo file)
    {
        FileStream stream = null;

        try
        {
            stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
        }
        catch (IOException)
        {
            return true;
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }

        //file is not locked
        return false;
    }

2
使用异常处理这个问题,代价相当高昂,不是吗? - DonBoitnott
好的,似乎这是检查文件是否可用的最佳方法。 - dsfgsho
1
那么你的意思是,如果它抛出异常,文件就可用了?并不是说这样是错误的,我只是认为应该相反。 - Serberuss
@StevenHouben 謝謝 Steven。我現在已經添加了您的代碼,看起來應該是可以運行:) 但出現一些問題,PowerPoint 現在開始創建文件。(在我的磁盤上可以看到大小為0kb),但它不再開始進行轉換的過程。我完全被卡住了。 - Trevor Daniel
1
许多时候,使用FileSystemWatcher实际上需要一种确定文件是否仍在写入的方式,因为Created事件在文件完全写入之前就被抛出了。我通常会将已创建的文件排队进行可用性检查,然后再进行处理。 - jamesmillerio
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接