命令行参数作为文件路径

8

这是一个很常见的问题,但我对解决它感到困惑。

在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#的知识非常少,感谢你的帮助。


3
请贴出一些代码让我们查看。 - Nasreddine
3
你能贴出你代码的相关部分吗? - Szymon
1
我对C#没有任何了解,感谢您的帮助。考虑到这一点,您确定自己适合从事编程工作而不是阅读教程和编程教材吗? - O. R. Mapper
1
请不要在问题标题中包含有关所使用编程语言的信息,除非没有它就没有意义。标签可以起到这个作用。 - Ondrej Janacek
请查看编辑。 - Nirav Kamani
显示剩余5条评论
7个回答

1
我不确定为什么你在这里遇到了问题。在M $ Windows中,目录可以带或不带反斜杠,因此所有这些都是正确的:c:c:\c:\ media c:\ 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会显示带反斜杠的转义字符。因此,如果用户输入c:\media\,则字符串将存储为c:\media\,但在VS中快速查看路径时,您将看到c:\\media\\;通过文本可视化功能深入挖掘,您将看到路径正确地显示为c:\media\


现在想象一下将"C:\MEDIA"作为输入,会发生什么? - Nirav Kamani
好的,就像在Windows中所有命令行应用程序一样,输入应该用引号括起来。所以你会这样调用:listdir.exe "c:\my media"listdir.exe "c:\my media\"。你会发现C#控制台应用程序会正确解释它,并将c:\my media\放入你的路径变量中。 - Chris Moutray
1
@NiravKamani 我明白了,问题刚好就在这里 :) 那么为什么你不能修剪引用呢?例如 string path = args[0].TrimEnd('"'); - Chris Moutray
还有其他解决方案吗?这个方法虽然可行,但是能否在不修改用户输入的情况下实现呢? - Nirav Kamani
@NiravKamani 为什么不修改输入很重要?有时候你只需要将其作为现状,继续编写应用程序。 - Chris Moutray
显示剩余3条评论

1
你应该使用 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");
    }
}

更新:路径中包含空格时应使用引号传递。或者,如果路径是唯一的输入,则应连接所有命令行参数。


路径抛出ArgumentException,因为最后有双引号。 - Nirav Kamani

1

0

嗯,如果我理解正确的话。你可以使用string.Format。有一些重载方法可以帮助你在不修改太多用户输入的情况下完成任务。

示例代码:

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

0

C#将\解释为转义字符。因此,\"被解释为" 修复方法(如果您确定参数中没有“”):

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

另一种方法是:您可以在不使用引号的情况下设置命令行参数。 - Dmitriy Finozhenok

0

我认为你想得太多了。从逻辑上讲,那不是有效的输入。在命令提示符中,\是转义字符,就像在C#字符串内部一样。你输入的("F:\")是一个无效的值,用户需要进行更正。用户此时表示他们想要引号。


0
请注意,在参数中传递文件名时,您需要在文件所在的目录具有访问权限,否则应用程序的某些部分可能会意外失败,并且您可能需要花费很多时间来找出问题所在。
    var args1 = Environment.GetCommandLineArgs().Skip(1);
    if (args1 != null && args1.Count() > 0)
    {
        //do stuff
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接