English 中文(简体)
我如何可靠地保证文件/文件夹的访问权?
原标题:
  • 时间:2009-02-20 20:41:29
  •  标签:

什么是最可靠的方法,确保我想操纵的文件或文件夹是可访问的(而不是只读)?

我知道我可以使用ACL添加/设置条目(使文件/文件夹非只读),但我该如何知道是否需要使用安全权限来确保文件访问?或者我只是可以将其添加为额外的措施并处理异常/负面场景?

我应该如何知道何时关闭或仅清除流?例如,我是否应该尝试在方法中使用流一次,然后在结束时刷新/关闭/处理?如果我使用dispose(),我是否仍然需要显式调用flush()和close()?

我提出这个问题是因为不断确保文件可用是一个核心要求,但很难保证,所以一些关于代码设计的提示会很有帮助。

谢谢 (Xièxiè)

问题回答

没有办法保证对文件的访问。我知道这不是一个受欢迎的回答,但它是100%真实的。即使您在Win32机器上具有独占非共享打开,也不能保证对文件的访问。

有太多这种无法控制的失败方式。经典例子是打开网络文件。你可以用任何方式、任何帐户来打开它,我只需要走过去拔掉网络电缆。这样会导致你无法访问文件。

我说这话并不是为了恶意或傲慢。我说这话是为了确保人们明白在文件系统上操作是非常危险的操作。您必须接受操作可能会失败的事实。对于任何涉及磁盘的操作,您必须拥有备份方案。

什么是确保我想操作的文件夹或文件是可访问的(非只读)的最可靠方式?

以写模式打开它们?

  • 尝试将新文件写入文件夹并捕获任何异常。同时进行通常的检查,如文件夹/文件是否存在等。

  • 你永远不应该在代码中更改文件夹安全性,因为环境可能会发生很大的变化,从而引起严重问题。相反,确保安全性在事先得到很好的记录和配置。或者在你自己的代码中使用模拟来确保始终以具有对文件夹/文件的完全权限的用户运行所需的代码。

  • 除非没有其他选择,否则不要调用Dispose()。 在关闭文件或者想将数据流内容提交到文件/磁盘之前,始终要清空缓冲区。何时执行此操作取决于需要写入的数据量以及编写数据所需的时间。

确保文件夹可写的100%百分百无误的方法 - 创建一个文件,关闭它,验证它是否存在,然后将其删除。 有点繁琐,但您要求完全无误。

如果您无法写入文件,更好的做法是处理各种异常,以涵盖您有关ACL的问题。

同时,除非我在完成写入之前需要从文件中读取(在这种情况下我调用flush,然后调用close),我总是显式调用Close。

  • Flush() - Synchronizes the in-memory buffer with the disk. Call when you want to write the buffer to the disk but keep the file open for further use.
  • Dispose(bool) - Releases the unmanaged resource (i.e. the OS file handle) and, if passed true, also releases the managed resources.
  • Close() - Calls Dispose(true) on the object.

另外,Dispose在关闭句柄之前会清除数据,因此没有必要显式调用flush(尽管根据您处理的数据量和类型,频繁刷新可能是一个好主意)。

如果您正在对文件进行相对原子操作,且不需要长时间运行的句柄,则“使用”范例可确保您正确地处理文件,例如:

using (StreamReader reader = new StreamReader("filepath"))
{
    // Do some stuff
} // CLR automagically handles flushing and releasing resources




相关问题
热门标签