是否有可能确保某个文件可以在不打开的情况下写入?

时间:2013-10-13 00:02:08

标签: c# .net vb.net file-io

我为输出文件名选择编写了一个自定义控件,其中包含文件名的典型:文本框,“浏览”按钮以及特定于我的应用程序的一些其他功能。

文本框会根据文件名更改颜色。如果无法写入文件位置,则会变为红色。如果文件已存在,则变为黄色。否则,它仍然是系统指定的颜色。

要查看文件是否存在,我使用IO.File.Exists;很简单。

我实现了“如果文件可以写入”作为一个简单的try-catch块,其中文件实际打开,写入其中,关闭,然后删除。如果在任何时候抛出异常,我知道用户不能使用该文件名,我将文本框变为红色。

这是一个包罗万象;因为我正在做我打算做的实际操作,所以这是万无一失的。然而,让软件创建和删除疯狂的文件似乎是不负责任的,只是为了看它是否可以。

所以我的问题是,如何在不创建文件的情况下复制此功能?我可以看到我必须:

  1. 检查合法性的路径(例如,'z:'不是有效的文件名)。这需要解析路径并确保所有目录都存在。
  2. 如果该位置存在,我必须检查写入权限。 (为此,有几个回答的问题。)
  3. 还有别的吗?

    修改

    几分钟之内,我看到人们已经投了一个答案,批评我正在检查 该文件在实际写入之前是否可以访问。虽然我很感谢专家从我的问题中“退缩”,看看是否有完全不同的方法来实现它,告诉我不应该这样做,这不是我的问题的答案。

    让我详细说明我的应用程序(我不希望同时有数百名用户)。

    我在数据采集应用程序中使用此文件选择器控件。在许多情况下,您即将运行的测试以某种方式“昂贵”。因此,非常谨慎地进行设置至关重要。覆盖数据可能非常昂贵(对于可怕的用户,我有一个复选框,将日期和时间追加到毫秒到文件名)。

    因此,我的指示器颜色的目的不是为软件提供一种可靠的方式来知道文件可以被写入(该检查仍然在它实际需要的时刻完成),它可以作为指示器用户,至少他已正确设置文件名,所以如果他继续前进,他保证不会覆盖旧数据,并且他几乎确定最后一分钟IO错误(文件名错误)不会让实验无法记录。

2 个答案:

答案 0 :(得分:5)

我建议这样做 - 在用户提交动作之前不要检查任何内容。使用您当前的方法,即使您验证文件没问题,也可能在用户实际提交写入文件后5秒钟锁定。进行初步检查可能只会给用户一个估计成功的错误印象。特别是在具有100多个并发用户的终端服务器上考虑这一点。

使用重试/取消/等显示提示没有任何问题。如果没有访问权限,请让用户决定。

修改

没有冒犯,但有关于如何处理此类碰撞的标准。 Windows标准是向用户显示提示。还要考虑这一点 - 如果您突然拒绝对该文件夹进行写入访问,而您可能需要聘请其他系统/网络管理员。

如果操作费用昂贵,请确保此人得到报酬。来吧,如果您的网络在写作期间出现故障怎么办?硬盘?路由器?写入文件可能会被中断的原因有很多,您应该为此做好准备。如果你负担不起,请确保你投资了良好的基础设施和优秀的人才来支持它。

在地球上,你可以增加获得成功锁定文件的机会:

  • 选择一个唯一的文件名,使用基于日期时间的哈希作为后缀/前缀。
  • 写入用户的主目录,也称为%UserProfile%,您很可能会成功。

答案 1 :(得分:1)

我可以理解你的问题,不想冒失去的风险"昂贵的"数据,因为文件无法写入,负责的程序会尽力避免这种情况。

我会通过缓存结果来做到这一点。在运行测试之前,将模拟结果写入用户数据空间中的某个文件,然后保持文件打开并将实际结果写入文件。完成此操作后,将其写入用户指定的文件。提供一个恢复选项,该选项将读取缓存文件并将其写入用户的文件。

您的方法可能会失败,因为文件在开始时是可写的并不意味着它仍然可写。网络可能已经下降。有人可能已经删除了闪存驱动器。其他人可能通过有缺陷的路由器进行大量数据传输。 (真实案例 - 我花了很长时间来证明这是一个网络问题,而不是我的程序。当我展示dir:*。* / s on multiple时,终于接受了他们的错机器一下子几乎肯定会导致一个或多个失败。)