C# 如何知道文件系统是否为只读(.NET标准)?
我有一个函数,可以读取一个文件,如果它不存在,就会创建并填充它。但是,它位于.NET标准库中,由AWS Lambda函数调用,该函数返回以下错误: “只读文件系统” 我如何确定文件系统在代码中是只读的,这样我就可以跳过文件的创建,以及什么时候是这种情况 编辑:我的问题与你的不同。这个问题是关于在保存文件之前尝试读取文件的问题。我问的是如何知道文件系统是否允许我保存文件(由于文件系统的限制)一般来说,对于几乎所有与文件系统有关的事情,诀窍是记住它们是不稳定的,因此,答案是只要C# 如何知道文件系统是否为只读(.NET标准)?,c#,io,.net-standard,C#,Io,.net Standard,我有一个函数,可以读取一个文件,如果它不存在,就会创建并填充它。但是,它位于.NET标准库中,由AWS Lambda函数调用,该函数返回以下错误: “只读文件系统” 我如何确定文件系统在代码中是只读的,这样我就可以跳过文件的创建,以及什么时候是这种情况 编辑:我的问题与你的不同。这个问题是关于在保存文件之前尝试读取文件的问题。我问的是如何知道文件系统是否允许我保存文件(由于文件系统的限制)一般来说,对于几乎所有与文件系统有关的事情,诀窍是记住它们是不稳定的,因此,答案是只要尝试您想做的任何事情,
尝试您想做的任何事情,并在异常失败时处理异常
要理解我所说的“volatile”是什么意思,让我们假设您有一些神奇的Path.IsReadOnlyFileSystem()
方法,可以完全满足您的需要。因此,您希望运行以下代码:
if (!Path.IsReadOnlyFileSystem(fileIWantToCreate))
{
using(var sw = new StreamWriter(fileIWantToCreate))
{
//fill file here
}
}
try
{
if (!Path.IsReadOnlyFileSystem(fileIWantToCreate))
{
using(var sw = new StreamWriter(fileIWantToCreate))
{
//fill file here
}
}
}
catch( )
{
// handle the exception here
}
try
{
using(var sw = new StreamWriter(fileIWantToCreate))
{
//fill file here
}
}
catch( )
{
// handle the exception here
}
但是,AWS云中发生了一些事情,迫使服务进入只读模式。就发生在这里:
if (!Path.IsReadOnlyFileSystem(fileIWantToCreate))
{
/* <==== AWS goes read-only here ====> */
using(var sw = new StreamWriter(fileIWantToCreate))
现在很清楚,无论如何,您都必须处理异常。在实际功能方面,if()
条件实际上没有任何好处。它真正做的只是增加代码的复杂性
即使如此,仍有一种倾向认为保留if()
条件可以通过保存异常处理程序和保存磁盘访问来获得性能优势这个信念是有缺陷的。
if()
条件实际上是在检查文件系统状态时添加磁盘访问。此外,每次执行都会增加此成本。保留if()
条件确实会保存异常处理程序,但仅在初始访问失败的情况下。诚然,展开堆栈以处理异常是计算机科学中最昂贵的操作之一。这就是“正常控制流不使用异常”咒语背后的“原因”。然而,磁盘访问是为数不多的性能更差的事情之一
总之,我们有时会有一个异常处理程序堆栈展开,而每次都有一个额外的磁盘访问。从性能的角度来看,很明显,如果没有if()
条件,您会过得更好。出于正确性原因,我们不需要if()
条件,出于性能原因,我们也不需要它。。。。再提醒我一次为什么我们有它?更好的模式会完全跳过该块,如下所示:
if (!Path.IsReadOnlyFileSystem(fileIWantToCreate))
{
using(var sw = new StreamWriter(fileIWantToCreate))
{
//fill file here
}
}
try
{
if (!Path.IsReadOnlyFileSystem(fileIWantToCreate))
{
using(var sw = new StreamWriter(fileIWantToCreate))
{
//fill file here
}
}
}
catch( )
{
// handle the exception here
}
try
{
using(var sw = new StreamWriter(fileIWantToCreate))
{
//fill file here
}
}
catch( )
{
// handle the exception here
}
因此,magicIsReadOnlyFileSystem()
方法是不需要的,甚至是没有帮助的
这并不是说该方法不存在(我不认为它是.Net标准的一部分,但取决于您的平台,您可能可以调用较低级别的构造)。只是这不是一个特别好的主意。我的测试的可能重复显示try{throw new Exception();}catch{}
比创建文件慢得多。