如何在C#中的相对路径中获取文件

时间:2010-07-15 20:09:20

标签: c# .net file directory

如果我有一个名为app.exe的可执行文件,这是我在C#中编码的,我如何使用相对路径从与app.exe相同的目录中加载文件夹?

这会在路径异常中抛出非法字符:

string [ ] files = Directory.GetFiles ( "\\Archive\\*.zip" );

如何在C#中做到这一点?

5 个答案:

答案 0 :(得分:38)

要确保您拥有应用程序的路径(而不仅仅是当前目录),请使用:

  

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getcurrentprocess.aspx

现在你有一个Process对象代表正在运行的进程。

然后使用Process.MainModule.FileName

  

http://msdn.microsoft.com/en-us/library/system.diagnostics.processmodule.filename.aspx

最后,使用Path.GetDirectoryName获取包含.exe:

的文件夹
  

http://msdn.microsoft.com/en-us/library/system.io.path.getdirectoryname.aspx

所以这就是你想要的:

string folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Archive\";
string filter = "*.zip";
string[] files = Directory.GetFiles(folder, filter);

(请注意,您问题中的"\Archive\"现在为@"\Archive\":您需要@以便\反斜杠不会被解释为转义序列的开头)

希望有所帮助!

答案 1 :(得分:30)

string currentDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
string archiveFolder = Path.Combine(currentDirectory, "archive");
string[] files = Directory.GetFiles(archiveFolder, "*.zip");

第一个参数是路径。第二个是你想要使用的搜索模式。

答案 2 :(得分:15)

像这样写:

string[] files = Directory.GetFiles(@".\Archive", "*.zip");

。是相对于您启动exe的文件夹,@是允许名称中的\。

使用过滤器时,将其作为第二个参数传递。您还可以添加第三个参数,以指定是否要递归搜索模式。

要获取.exe实际所在的文件夹,请使用:

var executingPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

答案 3 :(得分:2)

正如其他人所说的那样,你可以/应该在@之前添加字符串(虽然你也可以逃避反斜杠),但是他们掩饰了什么(也就是说,尽管做了一个与之相关的变化)事实是,正如我最近发现的那样,在路径名的开头使用\,而没有.来表示当前目录,是指当前目录树的根。

C:\foo\bar>cd \
C:\>

C:\foo\bar>cd .\
C:\foo\bar>

(根据我的经验,使用.本身与使用.\具有相同的效果。我不知道是否有任何特定情况,他们在某种程度上不会意味着相同的事情。)

如果您愿意,也可以暂停.\

C:\foo>cd bar
C:\foo\bar>

事实上,如果你真的想要,你甚至不需要使用反斜杠。 Forwardslashes工作得非常好! (虽然单个/不会像\那样对当前驱动器根目录进行别名。)

C:\>cd foo/bar
C:\foo\bar>

你甚至可以替代它们。

C:\>cd foo/bar\baz
C:\foo\bar\baz>

...我在这里真的离开了主题,所以如果你不感兴趣,可以随意忽略这一切。

答案 4 :(得分:0)

非常直接,使用相对路径

pattern: "^%{YEAR}-%{MONTH}-%{MONTHDAY}"