检查文件是否存在异步

本文关键字:异步 存在 是否 文件 检查 | 更新日期: 2023-09-27 18:33:08

我希望有一个File.ExistsAsync()

我有:

bool exists = await Task.Run(() => File.Exists(fileName));

为此使用线程感觉就像一个反模式。有没有更清洁的方法?

检查文件是否存在异步

没有比您的解决方案更干净的方法了。

除了竞争条件的问题,我相信您的解决方案在某些情况下可以使用。例如

我在许多不同的文件夹中都有静态文件内容。(在我的情况下,cshtml视图,脚本文件,css文件,用于MVC(这些文件(在应用程序执行期间变化不大(始终在对 Web 服务器的每个请求中检查,由于我的应用程序架构,检查文件的位置比默认 mvc 应用程序中多得多。如此之多,以至于file.exist在每个请求中占用了相当一部分时间。

所以比赛条件通常不会发生。 对我来说唯一有趣的问题是性能

使用 Task.Factory.StartNew(( 启动任务需要 0.002 毫秒(来源 为什么线程和任务之间的性能差异如此之大?(

调用 file.exists 需要"当文件存在时为 0.006255ms,当文件不存在时为 0.010925ms"。[理查德·哈里森]

所以通过简单的数学调用异步文件.存在需要 0.008 毫秒到 0.012 毫秒

在最好的情况下,异步 File.Exists 所需的时间是 File.Exists 的 1.2 倍,在最坏的情况下,它需要 1.3 倍的时间。 (在我的情况下,搜索的大多数路径都不存在(,所以大多数时候File.Exist大多接近0.01毫秒

因此,开销不大,您可以更有效地利用多个内核/硬盘控制器等。 通过这些计算,您可以看到异步检查是否存在 2 个文件,在最坏的情况下,您的性能已经提高了 1.6 (0.02/0.012 (

好吧,我只是异步文件.存在在特定情况下是值得的。

我的帖子注意事项:我可能没有正确计算所有内容我四舍五入了很多我没有在单台电脑上测量性能我从其他帖子中获取了绩效我刚刚添加了File.Exist和Task.Factory.StartNew((的时间(这可能是错误的(我忽略了很多多线程的影响

自从这个线程以来已经很久了,但我今天找到了它......

ExistsAsync绝对应该是一回事。事实上,在 UWP 中,你必须使用异步方法来找出文件是否存在,因为它可能需要超过 50 毫秒的时间(任何"可能"超过 50 毫秒的时间都应该是 UWP 语言中的异步(。

但是,这不是UWP.我需要它的原因是检查folder.exists如果在网络共享、远程磁盘或空闲磁盘上会阻止 UI。所以我可以把所有的消息都放在"检查...",但 UI 不会在没有aysnc(或ViewModeltimers等(的情况下更新。

您的代码:

bool exists = await Task.Run(() => File.Exists(fileName));

完美工作。在我的代码中,我同时具有(ExistsExistsAsync(,因此我可以在非UI线程上运行时运行Exists(),而不必担心开销。

没有 File.ExistsAsync 可能是有充分理由的; 因为拥有一个绝对没有意义;File.Exist不会花费很长时间;当文件存在时,我测试了它为 0.006255ms,当文件不存在时,我测试了它为 0.010925ms。

有几次调用File.Exists是明智的;但是通常我认为正确的解决方案是打开文件(从而防止删除(,捕获任何异常 - 因为不能保证文件在调用File.Exists后将继续存在。

当您要创建一个新文件而不覆盖旧文件时:

File.Open("fn", FileMode.CreateNew)

对于大多数用例,我可以想到File.Open(((无论是现有的还是新建的(会更好,因为一旦调用成功,您将拥有文件的句柄并能够对其进行处理。即使使用文件的存在作为标志,我想我仍然会打开和关闭它。我唯一真正使用 File.Exists 的时间是在调用浏览器之前检查本地 HTML 文件是否存在,这样我就可以在没有时显示一条很好的错误消息。

不能保证在 File.Exists 之后,其他内容不会删除该文件;因此,如果您在使用 File.Exists 检查后打开了它,则打开的调用仍可能失败。

在我的测试中,在网络驱动器上使用FileExists比File.Open花费更长的时间,File.Exist需要1.5967ms,而File.OpenRead需要0.3927ms(

也许如果你能扩展你为什么要这样做,我们将能够更好地回答;在那之前,我会说你不应该这样做。