Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用文件监视程序确定文本(.txt)文件何时完成写入磁盘_C#_Excel_Vba_Eof_File Watcher - Fatal编程技术网

C# 如何使用文件监视程序确定文本(.txt)文件何时完成写入磁盘

C# 如何使用文件监视程序确定文本(.txt)文件何时完成写入磁盘,c#,excel,vba,eof,file-watcher,C#,Excel,Vba,Eof,File Watcher,我让一家外部公司用C#编写了一个“文件监视程序”。该程序读取excel工作表,其中包含要监视的文件夹的文件路径列表。“file watcher”程序监视,以查看其监视的每个文件夹中是否出现任何新的文本(.txt)文件。如果有一个新的文本文件,它将打开一个excel工作表,其中包含一个宏并运行宏,然后关闭工作表。一切都很好。。。除了文本文件由CMM(坐标测量机)自动生成 旁注:虽然我有一些编程类(Python、Matlab、VBA for Excel)。我决不是一个编程专家,也不是一个计算机专家

我让一家外部公司用C#编写了一个“文件监视程序”。该程序读取excel工作表,其中包含要监视的文件夹的文件路径列表。“file watcher”程序监视,以查看其监视的每个文件夹中是否出现任何新的文本(.txt)文件。如果有一个新的文本文件,它将打开一个excel工作表,其中包含一个宏并运行宏,然后关闭工作表。一切都很好。。。除了文本文件由CMM(坐标测量机)自动生成

旁注:虽然我有一些编程类(Python、Matlab、VBA for Excel)。我决不是一个编程专家,也不是一个计算机专家

CMM似乎创建了一个空的.txt文件(显示为0 kb),然后CMM每隔几分钟就会转储一些数据。因此,文本文件将显示7KB,然后显示15KB。。。等我可以在任何阶段点击这个文本文件,它将打开,但只显示与完成kb成比例的文本。如果我关闭文本文件,然后重新打开它,通常会有更多的文件完成。CMM(如果您不熟悉)测量零件并通过这些文本文件报告测量结果。有些零件需要15秒进行测量(只有少数测量),有些零件需要45分钟(许多测量)。虽然我还没有确认这一点,但当零件完成测量时,会弹出一个“是”/“否”对话框供CMM操作员单击,我认为直到操作员做出“是”或“否”选择,CMM操作员才会完成写入文本文件的最后一块。操作员可以在10秒或30分钟内做出选择(如果他们去吃午饭或其他什么的话)。事实上,在周五,他们可以回家,直到周一才做出选择


我遇到的问题是,C#程序在文本文件完成之前将文本文件的文件路径发送到excel宏。在我看来,在将txt文件的文件路径发送到excel宏之前,我需要将C#程序修改为“等待”文本文件完成。这可能吗?文本文件是否包含某种类型的EOF(文件结束)标记?

如果您无法使用注释中的任何技巧,则应将文件内容读入C#程序,并将其保存为Excel或其他文本文件(仅当检测到“报告结束”时)。如果没有,只需在一分钟后重新开始


也许(我不确定这会有多复杂)您可以将文件作为流读取,并在写入后立即接收新数据。因此,您可以等待文件完成,而无需反复阅读。

以下是我找到的用于获取信息的代码

Dim cmdLine As Object
Dim result As String
Dim SearchStr As String
Dim FilePath As String  

Set cmdLine = CreateObject("WScript.Shell")
result = cmdLine.Exec("%comspec% /C Find " & SearchStr & " " & Chr(34) & FilePath & Chr(34)).STDOut.ReadAll

对于这类问题,通常的解决方法是不向目标文件夹写入。改为写入临时文件夹,然后在文件写入完成后将其移动到目标文件夹。这样,文件观察者只在文件准备好使用时才看到它。还有其他方法可以解决这个问题,但这通常是最简单的方法。这听起来很简单,但我不确定这是否可行,因为CMM可能没有这种能力。这就意味着我需要一个定制的程序来实现这一点。。。这和我已经在的船是一样的。试试这个:如果你试图在CMM激活时以独占模式打开文件,打开会失败吗?如果是这样,您就有了解决方案:继续尝试以独占模式打开文件,直到成功为止(两次尝试之间有一秒左右的延迟)。(例如,试着像
file.open(“filename”,FileMode.open,FileAccess.ReadWrite,FileShare.None”)那样打开文件-不过请注意,如果CMM以共享模式打开文件,您将能够成功打开它,并且这种方法不起作用。@mjwills解决方案是我通常采用的方法。另一种方法是让他们在.txt文件完成后在其末尾添加类似#EOF的内容,或者如果您可以将上次写入时间与当前时间进行比较,然后与最大时间跨度进行比较,如果超过该时间跨度,则处理该文件。最终,这正是我所做的。不是一个理想的解决方案。。。但是让我通过。。。