0

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

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

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

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

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

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

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

还有别的事吗?

编辑

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

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

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

因此,我的指示器颜色的目的不是为软件提供一种确定文件可以写入的可靠方式(该检查仍然在它实际必须的那一刻完成),它是作为用户的指示器至少他已经正确设置了文件名,所以如果他继续前进,他可以保证不会覆盖旧数据,而且他几乎可以肯定最后一分钟的 IO 错误(文件名拼写错误)不会让实验在未记录的情况下运行。

4

2 回答 2

5

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

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

编辑:

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

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

实际上,您可以增加成功锁定文件的机会:

  • 选择一个唯一的文件名,使用基于日期时间的哈希作为后缀/前缀。
  • 写入用户的主目录,也称为%UserProfile%,很有可能你会成功。
于 2013-10-13T00:15:29.750 回答
1

我可以理解您不想冒丢失“昂贵”数据的风险,因为无法写入文件,负责任的程序会尽力避免这种情况。

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

您的方法可能会失败,因为文件在开始时是可写的并不意味着它仍然是可写的。网络可能已经瘫痪。有人可能已经移除了闪存驱动器。其他人可能正在通过有故障的路由器进行大量数据传输。(现实世界的案例——我花了很长时间才证明这是一个网络问题,而不是我的程序。当我在多台机器上同时显示 dir :*.* /s 几乎肯定会导致时,我终于接受了这是他们的错一个或多个失败。)

于 2013-10-13T03:17:00.373 回答