Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文件.Exists被认为是有害的吗?_C#_.net_Vb.net_File Io - Fatal编程技术网

C# 文件.Exists被认为是有害的吗?

C# 文件.Exists被认为是有害的吗?,c#,.net,vb.net,file-io,C#,.net,Vb.net,File Io,我经常使用库函数,如File.Exists,在打开文件或执行其他操作之前检查文件是否存在。虽然多年来我在实践中很幸运,但我想知道这是否是一种考虑不周的模式 任何IO调用(如文件系统读取)都可能由于多种原因而失败。路径字符串可能是错误的,或者该文件实际上不存在,您可能缺少权限,其他人可能拥有阻止您的锁。您甚至可以让网络上的另一个进程或另一个用户在file.Exists和Open之间的毫秒内移动文件 即使您从File.Exists中获得了成功的结果,您仍然应该将实际打开的语句包含在try块中,以处理

我经常使用库函数,如
File.Exists
,在打开文件或执行其他操作之前检查文件是否存在。虽然多年来我在实践中很幸运,但我想知道这是否是一种考虑不周的模式

任何IO调用(如文件系统读取)都可能由于多种原因而失败。路径字符串可能是错误的,或者该文件实际上不存在,您可能缺少权限,其他人可能拥有阻止您的锁。您甚至可以让网络上的另一个进程或另一个用户在
file.Exists
Open
之间的毫秒内移动文件

即使您从
File.Exists
中获得了成功的结果,您仍然应该将实际打开的语句包含在try块中,以处理其他可能的故障模式之一。如果我没有记错的话,
File.Exists
只会让你产生一种错误的安全感,如果你使用它而不是
Try
(我确信我过去偶尔会这样做)


所有这些听起来都像是我应该放弃
File.Exists
,改变我找到的任何现有代码,只使用Try…Catch模式。这是一个合理的结论吗?我意识到框架是作者编写的,但它是供我们使用的,但这并不能自动使它成为实践中的一个好工具。

如何处理未找到的文件取决于您自己。如果您使用了File.Exists来检查文件是否存在,或者您也可以在代码周围使用try-catch块并处理FilenotFound异常,这将标识文件是否存在。这完全取决于您,但我更愿意检查File.Exists。这与检查accesing对象的null相同,而不是在代码块周围编写try catch并在catch中标识对象为null。在您的终端处理此类验证总是好的,而不是将其留给c#try catch block。

如何处理未找到的文件取决于您自己。如果您使用了File.Exists来检查文件是否存在,或者您也可以在代码周围使用try-catch块并处理FilenotFound异常,这将标识文件是否存在。这完全取决于您,但我更愿意检查File.Exists。这与检查accesing对象的null相同,而不是在代码块周围编写try catch并在catch中标识对象为null。在您的终端处理此类验证总是好的,而不是将其留给c#try catch块。

您应该为任何可能合理引发异常的代码实现异常处理程序,并且任何I/O操作都属于该类别


但这并不意味着使用
File.Exists
是错误的。如果存在文件不存在的合理可能性,那么预防比治疗更有效。但是,如果该文件绝对应该存在,那么总体而言,偶尔出现异常可能比每次都先检查更有效。

对于任何可能合理引发异常的代码,您绝对应该实现一个异常处理程序,并且任何I/O操作都属于该类别


但这并不意味着使用
File.Exists
是错误的。如果存在文件不存在的合理可能性,那么预防比治疗更有效。但是,如果该文件确实存在,那么总体而言,偶尔出现异常可能比每次先检查更有效。

我认为答案完全取决于您使用file.Exists的具体原因

例如,如果您正在检查某个文件路径是否有文件到达,则file.Exists可能是合适的方法,因为您不关心不存在的原因是什么


但是,如果您正在处理最终用户请求的文件(即,请导入此excel文件),则您需要确切了解文件失败的原因。在这个特定的实例中,File.Exists不是一个非常正确的方法,因为在您检查文件和打开文件之间,文件的存在可能会发生变化。在本例中,我们尝试打开文件并在处理它之前获得锁。open方法将抛出适合您正在处理的特定场景的错误,以便您可以向用户提供有关问题的更准确信息(例如,另一个进程锁定了文件,网络文件不可用等).

我认为答案完全取决于您使用File.Exists的具体原因

例如,如果您正在检查某个文件路径是否有文件到达,则file.Exists可能是合适的方法,因为您不关心不存在的原因是什么


但是,如果您正在处理最终用户请求的文件(即,请导入此excel文件),则您需要确切了解文件失败的原因。在这个特定的实例中,File.Exists不是一个非常正确的方法,因为在您检查文件和打开文件之间,文件的存在可能会发生变化。在本例中,我们尝试打开文件并在处理它之前获得锁。open方法将抛出适合您正在处理的特定场景的错误,以便您可以向用户提供有关问题的更准确信息(例如,另一个进程锁定了文件,网络文件不可用等).

如果文件在正常操作条件下可能不存在(我的系统中没有任何东西被破坏),我将使用
File.Exists
。如果我知道文件应该存在(除非我的系统坏了),那么我就不使用
file.exist


不过,我不认为这是一种“模式”。最好的模式是在一个案例的基础上考虑你正在做的事情。

< P>我使用<代码>文件。