我尝试编写一个程序,使用包含相关文件路径的配置文件来导航本地文件系统。我的问题是:在执行文件I / O时(这将是从桌面应用程序到服务器并返回)和C#中的文件系统导航时使用的最佳实践是什么?
我知道如何谷歌,我找到了几个解决方案,但我想知道哪些功能最强大和灵活。同样,如果有人对C#文件I / O的异常处理有任何提示,这也会非常有帮助。
答案 0 :(得分:8)
您不需要单独的库,请使用System.IO
命名空间中的类,例如File
,FileInfo
,Directory
,DirectoryInfo
。一个简单的例子:
var d = new DirectoryInfo(@"c:\");
foreach(FileInfo fi in d.GetFiles())
Console.WriteLine(fi.Name);
答案 1 :(得分:3)
你在谈论各种各样的图书馆?
我非常坚持System.IO.Directory
等等。它拥有您需要的一切。
类似的东西:
foreach (var file in System.IO.Directory.GetFiles(@"C:\Yourpath"))
{
// Do ya thang.
}
答案 2 :(得分:2)
您可以在System.IO
命名空间中使用各种类,包括File
,FileInfo
,Directory
和DirectoryInfo
。
至于实践......与任何IO一样,请确保关闭所打开的任何流。您还可能需要使用Disposable
对象,因此请查看using
关键字。
答案 3 :(得分:2)
System.IO
:)
关于异常处理。除非我们期待例外,否则我们永远不应该抓住它。真正意想不到的例外应该没有得到解决。 [看起来有罪]好的,唯一的例外是最高级别,而仅用于报告目的,例如
// assuming console program, but every application Console, WinForm,
// Wpf, WindowsService, WebService, WcfService has a similar entry point
class Program
{
// assume log4net logging here, but could as easily be
// Console.WriteLine, or hand rolled logger
private static readonly ILog _log = LogManager.GetLogger (typeof (Program));
static void Main (string[] args)
{
AppDomain.CurrentDomain.UnhandledException +=
CurrentDomain_UnhandledException;
}
private static void CurrentDomain_UnhandledException (
object sender,
UnhandledExceptionEventArgs e)
{
_log.
Fatal (
string.Format (
"Unhandled exception caught by " +
"'CurrentDomain_UnhandledException'. Terminating program.",
e.ExceptionObject);
}
}
如果您预计会有例外情况,则可接受以下其中一项
// example of first option. this applies ONLY when there is a
// well-defined negative path or recovery scenario
public void SomeFunction ()
{
try
{
string allText = System.IO.File.ReadAllText ();
}
// catch ONLY those exceptions you expect
catch (System.ArgumentException e)
{
// ALWAYS log an error, expected or otherwise.
_log.Warn ("Argument exception in SomeFunction", e);
// if the use-case\control flow is recoverable, invoke
// recovery logic, preferably out of try-catch scope
}
}
或
// example of second option. this applies ONLY when there is no
// well defined negative path and we require additional information
// on failure
public void SomeFunction ()
{
try
{
string allText = System.IO.File.ReadAllText ();
}
// catch ONLY those exceptions you expect
catch (System.ArgumentException innerException)
{
// do whatever you need to do to identify this
// problem area and provide additional context
// like parameters or what have you. ALWAYS
// provide inner exception
throw new SomeCustomException (
"some new message with extra info.",
maybeSomeAdditionalContext,
innerException);
// no requirement to log, assume caller will
// handle appropriately
}
}