如果我有一个名为app.exe的可执行文件,这是我在C#中编码的,我如何使用相对路径从与app.exe相同的目录中加载文件夹?
这会在路径异常中抛出非法字符:
string [ ] files = Directory.GetFiles ( "\\Archive\\*.zip" );
如何在C#中做到这一点?
答案 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}"