Matlab 检测传输中的文件?

Matlab 检测传输中的文件?,matlab,filesystems,polling,Matlab,Filesystems,Polling,我正在编写一个应用程序,通过每隔几秒钟轮询一次目录来监视目录中的新输入文件。新文件通常可能是几兆字节,因此需要一些时间才能完全到达输入目录(例如:从远程共享复制) 是否有一种简单的方法可以检测文件当前是否正在被复制?理想情况下,任何方法都是平台和文件系统无关的,但如果不能做到这一点,则可能需要针对不同的平台使用特定的策略 我已经考虑过将两个目录列表分开几秒钟并比较文件大小,但这会带来一种时间/可靠性权衡,除非别无选择,否则我的上级不会满意 作为背景,应用程序是作为一组Matlab M文件编写的,

我正在编写一个应用程序,通过每隔几秒钟轮询一次目录来监视目录中的新输入文件。新文件通常可能是几兆字节,因此需要一些时间才能完全到达输入目录(例如:从远程共享复制)

是否有一种简单的方法可以检测文件当前是否正在被复制?理想情况下,任何方法都是平台和文件系统无关的,但如果不能做到这一点,则可能需要针对不同的平台使用特定的策略

我已经考虑过将两个目录列表分开几秒钟并比较文件大小,但这会带来一种时间/可靠性权衡,除非别无选择,否则我的上级不会满意

作为背景,应用程序是作为一组Matlab M文件编写的,因此恐怕没有JRE/CLR技巧


编辑:文件通过直接移动/复制操作直接到达输入,可以从网络驱动器,也可以从本地文件系统的另一个位置。此复制操作可能由人工用户而不是其他应用程序启动

因此,很难让文件提供者负责添加控制文件或使用中间暂存区域


结论:似乎没有简单的方法可以做到这一点,所以我决定采用腰带和背带的方法-如果满足以下条件,文件可以处理:

  • 它的大小在一段时间内不会改变,而且
  • 可以以只读模式打开文件(某些复制过程会锁定文件)

感谢大家的回应

最安全的方法是让将文件放在目录中的应用程序首先将它们放在不同的临时目录中,然后将它们移动到真实目录中(即使使用FTP或文件共享,这也是一种原子操作)。您还可以使用命名约定在一个目录中实现相同的结果

编辑:
这实际上取决于文件系统,取决于其复制功能是否具有“完整文件”的概念。我不太了解SMB协议,但如果它有这个概念,您可以编写一个应用程序,公开SMB接口(或修补程序Samba)和API,以获得完成文件拷贝的通知。不过可能要做很多工作。

一个简单的可能性是以相当大的间隔(2到5分钟)进行轮询,并且只在第二次看到新文件时确认它


我不知道在任何操作系统中,除了检查文件是否被锁定之外,还有什么方法可以确定文件是否仍在被复制。

文件是如何到达那里的?是否可以在写入时设置属性,然后在写入完成时更改属性?这需要通过写作来完成。。。这听起来好像不是一个选择

否则,缓存列表并将两个连续列表的文件大小相同的文件视为新文件是我能想到的最好方法

或者,您可以对文件使用修改后的时间-文件必须是新的,并且修改后的时间在过去至少为x。但我认为这相当于缓存列表

如果你每隔几秒钟就轮询一次文件夹,那就不会造成太多的时间损失了,是吗?它的平台是不可知的

此外,仅限linux:


与cron类似,但用于文件。不确定它如何处理您的特定问题-但可能有用吗?

这是一个历史悠久的中间件问题,简短的回答是:不

这两种“解决方案”将责任放在文件上传器上:(1)将文件上传到暂存目录中,然后将其移动到目标目录中(2)上传文件,然后创建/上传一个指示内容文件状态的“就绪”文件

第一个更好,但两个都不雅观。事实是存在着比文件系统更好的通信媒体。考虑使用一些只涉及推或拉的IPC(而不是两个文件系统),例如HTTP POST、JMS或MSMQ队列等等。此外,这也可以是同步的,允许接收文件的过程承认内容,甚至检查它是否有价值,并给客户一张收据——这是不可否认的正义之路。遵循这一点,您将永远不会遇到文件是否已交付到服务器进行处理的争论


你的操作系统是什么。在unix中,您可以使用“lsof”实用程序确定用户是否已打开文件进行写入。显然,在MS Windows Process Explorer中的某个地方也有相同的功能


或者,你可以尝试以独占方式打开该文件,然后退出。但这可能有点不可靠,而且很容易让你自食其果

在我发表第一篇文章将近一年后,我越来越接近于写一篇题为“FTP被认为是有害的”的论文。我在许多所谓的“企业”商店中看到了“通过FTP通过大文件进行通信”的反模式,这让我大吃一惊。我确信这可以追溯到应用程序之间的通信是通过在机器之间携带磁带来实现的时代,而且还没有人对“我们一直都是这样做的”的呼声提出质疑。有两种解决方案可以解决这个问题,除此之外还有很多其他解决方案。它们是SSH&SFTP和HTTP/S。上传、扫描、解析、处理数据并获得对这两种方法的响应。FTP只做第一部分。两者都是免费的“数据推送”解决方案。它们提供了相当好的安全性,而且配置和实现起来也很容易。有了OpenSSH和Apache这样的开源解决方案,就没有理由让FTP服务器继续运行了。