如果我有一个名为app.exe的可执行文件,我正在用C#编写它,那么我该如何使用相对路径从与app.exe在同一目录中加载的文件夹中获取文件?这会引发路径中的非法字符异常。
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文件的文件夹,@表示允许名称中出现\。
在使用过滤器时,将其作为第二个参数传递。您还可以添加第三个参数以指定是否要递归搜索该模式。
要获取实际驻留您的.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>
/
不像\
那样别名为当前驱动器根目录。)C:\>cd foo/bar
C:\foo\bar>
你甚至可以交替使用它们。
C:\>cd foo/bar\baz
C:\foo\bar\baz>
我可能有点跑题了,如果你对此不感兴趣,请随意忽略。
string[] offerFiles = Directory.GetFiles(Server.MapPath("~/offers"), "*.csv");