如何在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");