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

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

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

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

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

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

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\" :你需要@使得\反斜杠不被解释为转义序列的开始)

希望有所帮助!

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

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

写这样:

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

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

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

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

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

正如其他人所说,你可以/应该在@前面添加字符串(虽然你也可以只是逃避反斜杠),但是他们所掩盖的东西(即,尽管做了与之相关的更改但没有提起它)是事实上,正如我最近发现的那样,在路径名的开头使用\ ,没有. 表示当前目录,是指当前目录树的根目录。

 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> 

……但是我真的离开这里了,所以如果你不感兴趣,可以随意忽略这一切。

非常直接,使用相对路径

 string[] offerFiles = Directory.GetFiles(Server.MapPath("~/offers"), "*.csv");