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

43
如果我有一个名为app.exe的可执行文件,我正在用C#编写它,那么我该如何使用相对路径从与app.exe在同一目录中加载的文件夹中获取文件?这会引发路径中的非法字符异常。
string [ ] files = Directory.GetFiles ( "\\Archive\\*.zip" );

使用C#应该怎样做?

5个回答

51
为了确保获取到应用程序的路径(而不只是当前目录),请使用以下方法:

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\":你需要加上 @ 符号,这样 \ 反斜杠就不会被解释为转义序列的开始)

希望能帮到你!


9
我认为,Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 更简单易懂。 - Mikael Svenson
如何为映射到UNC路径的Web应用程序的顶级根目录中的虚拟目录执行此操作? - Piotr Kula

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

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


补充Kieren的评论:还有像OpenFileDialog和SaveFileDialog这样的东西可以在运行时更改当前目录(如果RestoreDirectory属性保持其默认值false)。 - Moe Sisko
公正的观点。我更新了我的答案。@Moe:好知道。我不知道RestoreDirectory的存在。 - Adam Lear
略微偏题:请注意,如果您想要当前目录中的文件,则不能将空字符串作为路径参数传递给Directory.GetFiles,但“.”可以。 - yoyo

20

请按照以下方式书写:

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

.表示相对于启动exe文件的文件夹,@表示允许名称中出现\。

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

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

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

1
.\ 表示相对于当前目录,我想是这样的吧? - Kieren Johnstone
1
一个单点(.)可以代表当前目录。两个点(..)则表示当前目录的父目录。 - Eric Olsson
没错,但问题是在相对于可执行文件的位置,而不是当前目录下的位置。 - Kieren Johnstone
更新了我的答案,明确指定了“.”和你的exe所在位置。 - Mikael Svenson

3

正如其他人所说,您可以/应该在字符串前面加上@(尽管您也可以仅转义反斜杠),但他们没有提到的是(即使与此相关的更改),最近我发现,使用\在路径名的开头,没有.来表示当前目录,是指当前目录树的根。

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

对比

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

(仅供参考)

根据我的经验,仅使用 . 与仅使用 \ 具有相同的效果。 我不知道是否有任何特定情况下它们并不意味着相同的事情。

如果您愿意,也可以省略前导 \

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

事实上,如果你真的想的话,甚至不需要使用反斜杠。正斜杠也可以完美地工作!(尽管单个/不像\那样别名为当前驱动器根目录。)
C:\>cd foo/bar
C:\foo\bar>

你甚至可以交替使用它们。

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

我可能有点跑题了,如果你对此不感兴趣,请随意忽略。


1
相当简单,使用相对路径。
string[] offerFiles = Directory.GetFiles(Server.MapPath("~/offers"), "*.csv");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接