我为输出文件名选择编写了一个自定义控件,具有典型的:文件名的文本框、“浏览”按钮以及特定于我的应用程序的一些其他功能。
文本框根据文件名改变颜色。如果无法写入文件位置,它将变为红色。如果文件已经存在,它会变成黄色。否则,它仍然是系统分配的颜色。
要查看文件是否存在,我使用 IO.File.Exists; 很简单。
我将“如果文件可以写入”实现为一个简单的 try-catch 块,在该块中实际打开文件,写入文件,关闭,然后删除。如果在任何时候抛出异常,我知道用户不能使用该文件名,我将文本框变为红色。
这是包罗万象的;因为我正在做我打算做的实际操作,所以它是万无一失的。但是,让软件疯狂地创建和删除文件只是为了看看它是否可以,这似乎是不负责任的。
所以我的问题是,如何在不创建文件的情况下复制此功能?我可以看到我必须:
- 检查路径的合法性(例如,'z:' 不是有效的文件名)。这需要解析路径并确保所有目录都存在。
- 如果该位置存在,我必须检查写权限。(为此存在几个已回答的问题。)
还有别的事吗?
编辑
几分钟之内,我看到人们已经在投票赞成一个批评我在实际写入文件之前检查文件是否可访问的答案。虽然我感谢专家从我的问题中“退后一步”,看看是否有完全不同的方法来实现它,但告诉我我不应该这样做并不是对我问题的回答。
所以让我详细说明我的应用程序(我不希望同时有数百个用户)。
我在数据采集应用程序中使用这个文件选择器控件。在许多情况下,您将要运行的测试以某种方式“昂贵”。因此,非常小心地进行设置至关重要。覆盖数据可能非常昂贵(对于害怕的用户,我有一个复选框,可以将日期和时间附加到文件名的毫秒级)。
因此,我的指示器颜色的目的不是为软件提供一种确定文件可以写入的可靠方式(该检查仍然在它实际必须的那一刻完成),它是作为用户的指示器至少他已经正确设置了文件名,所以如果他继续前进,他可以保证不会覆盖旧数据,而且他几乎可以肯定最后一分钟的 IO 错误(文件名拼写错误)不会让实验在未记录的情况下运行。