等待文件存在于目录 C#

Posted

技术标签:

【中文标题】等待文件存在于目录 C#【英文标题】:Waiting for a file to exist in a directory C# 【发布时间】:2016-10-26 07:09:14 【问题描述】:

我正在创建一个Visual C# application,它的部分功能是在.gz 文件出现在目录中时对其进行提取。一旦执行命令行参数,.gz 文件就会出现在指定目录中。

不幸的是,我收到一条错误消息,提示“找不到此文件”,这是因为它读取行以太快地提取 .gz 文件的原因。

换句话说,它试图在命令行参数执行之前执行.gz 文件并将文件实际放入目录中。

我想找到一种方法让我的程序在继续读取下一行之前等待文件出现在目录中。

以下是我的代码,任何帮助将不胜感激!谢谢!

else if (ddlDateType.Text == "Monthly" || ddlDateType.Text == "")

    //Check if Monthly date entered is valid
    if (DateTime.TryParseExact(txtDate.Text, MonthlyFormat, null,
        System.Globalization.DateTimeStyles.None, out Test) != true)
    
        MessageBox.Show("Enter a valid date.\nFormat: yyyyMM");
    
    else
    
        //Method that executes an arugment into the command prompt
        ExecuteCommand();

        //Method that extracts the file after it has already appeared in the directory
        ExtractFile();

        /*
        Goal is to wait for the file to appear in the directory before it executes
        the ExtractFile() method.
         */

    

【问题讨论】:

我的第一个想法就是做while (!File.Exists(theFile)) System.Threading.Thread.Sleep(1000); 【参考方案1】:

您可以使用 FileSystemWatcher。 https://msdn.microsoft.com/it-it/library/system.io.filesystemwatcher(v=vs.110).aspx

在此示例中,每次将文件添加到受监视的文件夹时都会调用回调 OnChanged。

   [PermissionSet(SecurityAction.Demand, Name="FullTrust")]
    public static void RunWathcer()
    

        // Create a new FileSystemWatcher and set its properties.
        FileSystemWatcher watcher = new FileSystemWatcher();

        watcher.Path = "PATH TO WATCH GOES HERE!!";

        /* Watch for changes in LastAccess and LastWrite times, and
           the renaming of files or directories. */
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;

        watcher.Filter = "*.*";

        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.EnableRaisingEvents = true;
    

    // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e)
    
        // Specify what is done when a file is changed, created, or deleted.
       Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
    

【讨论】:

扮演魔鬼的拥护者:如果在此目录路径中更改了所需文件以外的其他内容,会发生什么?那它不会失败吗? 显然你必须过滤预期的文件名等等......我提出了一个可能的解决方案,我没有看到所有程序然后我无法预测:-) 我不知道这个 FileSystemWatcher 类存在。我可以看到这很有用。 @Gary watcher.Filter 看起来可以设置为查找特定文件或文件扩展名(如果名称是动态的)。 是的,对,这里的详细信息:msdn.microsoft.com/it-it/library/… @DaniloCalzetta Twas 根本没有批评,我只是在问:)。

以上是关于等待文件存在于目录 C#的主要内容,如果未能解决你的问题,请参考以下文章

C#让程序等待按钮被按下

等待文件存在并且不被其他人占用

C#中的互斥锁是不是忙等待?

maxscript 文件存在问题

在 C# 中启动一个批处理文件,然后等待它退出再继续

您如何等待任务计划程序任务在批处理文件或 C# 中完成?