文件路径作为命令行参数

Posted

技术标签:

【中文标题】文件路径作为命令行参数【英文标题】:File Path as Command Line Argument 【发布时间】:2014-04-12 08:56:04 【问题描述】:

这是很常见的事情,但我很困惑解决这个问题。

在c#中将。

如果我输入 "F:\\" 那么这很完美。

但是当我输入 "F:\" 时,它会给出类似 F:" 的输出。

我知道这是因为反斜杠转义字符。

但我的问题是如何在不修改用户输入的情况下解决这个问题,因为逻辑上用户输入是正确的。

在这种情况下是否有可能在不修改用户输入的情况下获得正确的路径?

我也知道有@字符可以使用。

但正如我所说,这是命令行参数,所以字符串已经在变量中。

我也阅读了一些博客,但仍然无法解决我的问题。

C# Command-Line Parsing of Quoted Paths and Avoiding Escape Characters

编辑:实际上我的程序是列出目录内的所有文件,所以我首先检查 Directory.Exists(命令行参数),然后如果目录存在则获取所有文件的列表。

好的,所以在这种情况下,当用户给出如上所示的命令行参数时,驱动器存在逻辑上,但只是因为转义字符,它返回 false。

只需考虑如下打印命令行参数。

class Program

    static void Main(string[] args)
    
        Console.WriteLine("0", args[0]);

        Console.Read();
    

感谢您的帮助,我对 c# 的了解非常少。

【问题讨论】:

你应该贴一些代码给我们看看。 你能贴出你代码的相关部分吗? "我不懂 c# 谢谢你的帮助。" - 考虑到这一点,您确定自己处于从事程序工作而不是阅读教程和编程教学书籍的正确位置吗? 尽管如此,就像其他人所说的那样,您需要向我们展示相关问题的代码。通常,用户字符串不包含任何转义字符;这只是在 C# 源代码中写下它们时的表示。特别是,我不确定“当我提供输入时”描述了什么样的操作 - 您是否从 C# 中调用应用程序,将字符串作为命令行参数传递给其他应用程序? 请不要在问题标题中包含有关所用语言的信息,除非没有它就没有意义。标记用于此目的。 【参考方案1】:

我认为你在想这个。从逻辑上讲,不是有效的输入。 \ 是命令提示符上的转义字符,就像它在 c# 中的字符串中一样。您输入的内容 ("F:\") 是无效值,需要用户更正。用户此时表示他们想要报价。

【讨论】:

【参考方案2】:

使用Environment.GetCommandLineArgs()。它会清理路径。

查看此链接了解更多信息:http://msdn.microsoft.com/en-us/library/system.environment.getcommandlineargs(v=vs.110).aspx

【讨论】:

【参考方案3】:

我不确定您为什么在这里遇到问题。在 M$ Windows 中,可以使用或不使用反斜杠指定目录,因此所有这些都是正确的:c:c:\c:\mediac:\media\Directory.Exists(path) 和其他函数(如 Directory.GetFiles(path))也是如此。

以下是列出目录文件的非常简单的应用程序,在我的环境中,无论我是否在末尾添加斜杠,它都可以正常工作。所以c:\media\ 给了我所有的媒体文件。

class Program

    static void Main(string[] args)
    
        string path = args[0];
        Console.WriteLine("trying path: " + path);
        if (Directory.Exists(path))
            Directory.GetFiles(path).ToList().ForEach(s => Console.WriteLine(s));
        else
            Console.WriteLine("path not found");
    

需要注意的是,在visual studio中,使用Quick Watch等调试器时,会显示带有反斜杠的转义字符。因此,如果用户输入c:\media\,字符串将存储为c:\media\,但是当您快速查看 VS 中的路径时,您会看到c:\\media\\;使用文本可视化功能深入观察,您会看到正确显示为 c:\media\ 的路径。

【讨论】:

现在只需将“C:\ME DIA\”作为输入,会发生什么? 与 Windows 中的所有命令行应用程序一样,输入应该用引号括起来。所以你会像listdir.exe "c:\my media"listdir.exe "c:\my media\" 这样打电话。您会发现 c# 控制台应用程序会正确解释它并将 `c:\my media` 放入您的路径变量中。 只考虑第二种情况,在这种情况下,您的打印行将打印 c:\my media". 并且 Directory.Exist() 将返回 false,即使该目录仅因为末尾的双引号而存在。 @NiravKamani 我明白了,问题只是点击了 :) 那么你为什么不能修剪报价?例如string path = args[0].TrimEnd('"'); 还有其他解决方案吗?这是可行的,但是否可以不修改用户输入?【参考方案4】:

您应该使用Path 类,特别是Path.GetFullPath 方法来获取正确的完整路径。

class Program

    static void Main(string[] args)
    
        string path = Path.GetFullPath(args[0]);
        Console.WriteLine("trying path: " + path);
        if (Directory.Exists(path))
            var files = Directory.GetFiles(path);
            foreach (var file in files) Console.WriteLine(file);
        
        else
            Console.WriteLine("path doesn't exist");
    

UPD。带空格的路径应该用引号传递。或者,如果路径是唯一的输入,您应该连接所有命令行参数。

【讨论】:

路径最后因为双引号抛出ArgumentException。【参考方案5】:

C# 将 \ 解释为转义字符。所以 \" 被解释为 " 修复它的可能方法(如果您确定没有 " 内部参数:

string a = args[0].Replace('"', '\\');

【讨论】:

另一种方式:可以设置不带引号的命令行参数。【参考方案6】:

好吧,如果我理解正确的话。您可以使用 string.Format 。有一些重载方法可以在不修改太多用户输入的情况下为您提供帮助。

示例代码:

string[] inputs = ...
string output = string.Format("F:\\0\\1", inputs[0], inputs[1]);

【讨论】:

以上是关于文件路径作为命令行参数的主要内容,如果未能解决你的问题,请参考以下文章

将命令行参数转换为字符串

如何获取文件名命令行参数的完整路径?

如何让 perl 正确传递具有多个参数和复杂文件路径(空格和符号)的命令行参数?

如何从 C# 中的文件路径中去除引号和命令行参数?

如何从C#中的文件路径中删除引号和命令行参数?

为啥在将命令行图像文件中的参数作为参数传递时出现错误