【问题标题】:How to recognize a path inside a string如何识别字符串中的路径
【发布时间】:2008-11-15 13:38:16
【问题描述】:

只是...我得到一个字符串,其中包含文件路径和一些参数。如何识别路径?我想到了'.'的索引。在文件中...但我不喜欢它。
使用正则表达式怎么样?谁能指出我正确的方向?

问候

编辑:这些是有效的条目...
somefile.msi /a
C:\MyFolder\SomeFile.exe -i -d

我不太关心参数,因为一旦我有了路径,我就会假设其余的都是参数

【问题讨论】:

  • 可接受的参数是什么?其中一个参数也可以是路径或文件吗?
  • 这些是有效条目... somefile.msi /All c:\MyDire\someFile.exe -i if

标签: c# regex string


【解决方案1】:

您可以使用 System.IO.Path,它是静态方法。

bool isPath = System.IO.Path.GetDirectoryName(@"C:\MyFolder\SomeFile.exe -i -d") != String.Empty;
if (isPath)
{
    Console.WriteLine("The string contains a path");
}

静态 Path 类还有其他几个有用的方法,例如 .GetFilename、.GetExtension 和 .GetPathRoot。

您还可以使用 System.IO.Directory 和 System.IO.File 来获得其他功能。

【讨论】:

    【解决方案2】:

    除非你访问文件系统,否则你不能,因为路径可能包含空格。

    因此,您可以使用 File.Exists 测试每个可能的“文件”。 string.Split() 将在这里为您提供帮助。

    【讨论】:

    • 不要这样做。使用此方法的主要缺陷:意外名称将导致您的检查中止。想象一下(在 Win32 下)创建一个名为 C:\Program 的文件夹。这将导致您的方法假定 C:\Program Files 不存在。额外功劳:创建 C:\Program.exe 并观看乐趣。
    【解决方案3】:

    对于非 MSI 程序,UninstallString 被传递给 CreateProcess,因此您可能希望复制其确定文件名的方法。阅读http://msdn.microsoft.com/en-us/library/ms682425.aspx,尤其是lpApplicationName 和lpCommandLine 后半部分的注释。

    由 MSI 安装的程序有一个单独的系统(msi!MsiConfigureProduct 或 msi!MsiRemovePatches)。

    【讨论】:

      【解决方案4】:

      好吧,在你解决在字符串中查找路径之前,你需要概述一组规则,以确定在这个上下文中的路径

      对于操作系统来说,这是一个有效的文件名:a

      由于没有指定目录信息,当前目录将被使用。该文件没有扩展名。

      但仍然是一个文件名。

      这是您上下文中的路径吗?或者你的意思是也有目录信息的东西?

      您需要处理的示例很有用。

      【讨论】:

        【解决方案5】:

        在这种情况下,通常的方法是用空格进行标记(并使用引号表示带有空格的文件名)。然后使用 / 或 - 作为参数。我认为你最好使用一种标准的、可接受的格式,而不是只处理一部分案例。

        【讨论】:

          【解决方案6】:

          嗯,我认为唯一可靠的方法是访问文件系统,假设它是可访问的。
          我会在空格处剪切字符串,从末尾开始,取文件系统中存在的最长的字符串。

          例如:

          C:\My Folder\Some File.exe -i -d
          =>
          C:\My Folder\Some File.exe -i -d (no, although it might exist!)
          C:\My Folder\Some File.exe -i    (no)
          C:\My Folder\Some File.exe       (yes => That's this one)
          

          您必须考虑相对路径和 PATH 中的文件(如您的第一个示例,即所有 exe 文件 - 更糟糕的是,您可以在命令行上编写 foo.exe 或 foo!)。

          另外,您通常可以编写notepad/p 之类的东西,这不会简化算法,因为知道C:/windows/notepad.exe XP 中的有效路径! :-)

          【讨论】:

            【解决方案7】:

            如果您对字符串有任何控制权,我建议您更改它的表示方式。一种方法是使用 URL 样式参数 - 例如fileName=myFile;arg1=value 等。然后解析键就很简单了。

            任何类型的原始解析方案的问题在于尾随数据不一定是干净的。此外,您的文件名不一定不会包含空格、无关的“.”等。因此,无论您决定什么,100% 的时间都可能不正确。

            【讨论】:

            • 我对传入的字符串没有任何控制权
            【解决方案8】:

            看看 SYStem.IO.Path,你可能想要 GetDirectoryName(string)

            【讨论】:

              【解决方案9】:

              谢谢大家的回答。有几个帖子我想标记为答案...在这些情况下你会怎么做?

              以防万一有人想看看我在做什么,这是一个用于从我的计算机上卸载软件的小应用程序。我发布了代码,请随时下载并查看它。
              这篇文章的原因是实现private ProcessStartInfo GetProcessInfo(string uninstallString) 方法的好方法。

              这个项目的原因贴here...

              【讨论】:

                猜你喜欢
                • 2021-06-08
                • 2011-04-15
                • 2019-09-02
                • 1970-01-01
                • 2016-10-24
                • 1970-01-01
                • 2015-11-08
                • 2018-08-31
                • 1970-01-01
                相关资源
                最近更新 更多