文件路径作为命令行参数

时间:2014-03-09 08:36:08

标签: c# string command-line-arguments filepath

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

将文件路径作为c#中的命令行参数。

如果我输入“F:\\”,那么这很有效。

但是当我输入“F:\”时,它会输出 F:“

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

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

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

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

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

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

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

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

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

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

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

        Console.Read();
    }
}

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

6 个答案:

答案 0 :(得分:1)

我不确定你为什么在这里遇到问题。在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\

答案 1 :(得分: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");
    }
}

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

答案 2 :(得分:1)

使用Environment.GetCommandLineArgs()。它将清理道路。

有关详细信息,请参阅此链接:http://msdn.microsoft.com/en-us/library/system.environment.getcommandlineargs(v=vs.110).aspx

答案 3 :(得分:0)

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

示例代码:

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

我认为您过分考虑了这一点。逻辑上,不是有效输入。 \是命令提示符下的转义字符,就像在字符串中的c#中一样。您输入的内容(“ F:\”)是无效值,由用户来更正。用户此时说他们想要报价。