检查路径是否在Program Files中

时间:2014-02-13 13:36:20

标签: c# io

如果特定路径是“Program Files”中的目录,我该怎样检查C#?

C:\ Program Files \ someDir ... - >在程序文件

D:\ Apps \ someDir ... - >不在程序文件

谢谢!

6 个答案:

答案 0 :(得分:5)

您可以使用以下代码检查ProgramFiles(x86)中的路径:

string path = "yourpath";


        var programfileX86 = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);

        if (path.IndexOf(programfileX86, StringComparison.OrdinalIgnoreCase) >= 0)
        {
            //Found path
        }

答案 1 :(得分:1)

首先,您需要获取程序文件路径。您可以使用System.Environment执行此操作:

var programFilesPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFiles);

如果你想要32位程序文件路径,你只需要更改你要查找的特殊文件夹(System.Environment.SpecialFolder.ProgramFilesX86)。然后我会做一个包含:

var isInProgramFiles = myPath.ToLower().Contains(programFilesPath.ToLower());

那应该至少让你在90%的路上!祝你好运!

编辑/清理注释

作为旁注 - 有些情况下您可以拥有有效的输入,但这仍然不匹配。例如 - 使用“/”而不是“\”。如果要确保正确处理这些边界情况,可以从输入字符串创建“DirectoryInfo”对象,验证它实际上是一个文件夹,并标准化它的格式。该代码看起来像:

if (!System.IO.Directory.Exists(inputPath)) return false;
var checkPath = (new System.IO.DirectoryInfo(inputPath)).FullName;

在此示例中,“inputPath”与上面的“myPath”相同。这应该做一个适度的工作来消毒输入。祝你好运!

答案 2 :(得分:0)

如果您有路径变量:

string path = "/* whatever path */";

您可以通过以下方式检查文件夹是subfolder

path.IndexOf('\\' + subfolder + '\\') != -1

请注意,在更复杂的情况下,..可能会使您退出子目录,这意味着如果您有类似的内容,则不在文件夹f2中:

"\\base_on_drive\\subfolder\\f1\\f2\\..\\a_file.txt"

..会让你回到它的父文件夹f1

答案 3 :(得分:0)

if (path.Contains(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)) || (path.Contains(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)))

{

}

答案 4 :(得分:0)

假设您的程序可能在ProgramFiles中运行,您可能希望得到您正在检查的任何路径的fullpath(如果您获得相对路径)。此外,C#有一个方便的SpecialFolder枚举,您可以使用它来获取ProgramFiles目录。

以下代码将采用路径,将其转换为完整路径,并检查是否可以在其中找到ProgramFiles目录。您可能希望添加一些错误处理(例如检查null路径)。

static string programfileX86 = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);

public bool IsInsideProgramFiles(string path)
{
    // Get the fullpath in case 'path' is a relative path
    string fullPath = System.IO.Path.GetFullPath(path);

    return (fullPath.IndexOf(programfileX86, StringComparison.OrdinalIgnoreCase) >= 0);
}

注意:根据您运行代码的系统,您可能需要检查SpecialFolder.ProgramFilesSpecialFolder.ProgramFilesx86

要获得ProgramFiles目录的代码,请转到Toan Nguyen:

答案 5 :(得分:0)

该问题存在一些内部微妙的问题:

  1. 您应该比较路径不区分大小写的,例如"C:\PRogRAM FILES (x86)\Sample"没问题
  2. 分隔符可以是/或\所以"C:/PRogRAM FILES (x86)/Sample"也可以
  3. 你应该打破单独的,例如"C:\Program Files (x86)MyData\Sample"不正常
  4. 守则:

        public static Boolean PathIncludes(String path, String pathToInclude) {
          if (String.IsNullOrEmpty(pathToInclude))
            return false;
          else if (String.IsNullOrEmpty(path))
            return false;
    
          String[] parts = Path.GetFullPath(path).Split(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar, Path.VolumeSeparatorChar);
          String[] partsToInclude = Path.GetFullPath(pathToInclude).Split(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar, Path.VolumeSeparatorChar);
    
          if (parts.Length < partsToInclude.Length)
            return false;
    
          for (int i = 0; i < partsToInclude.Length; ++i)
            if (!String.Equals(parts[i], partsToInclude[i], StringComparison.OrdinalIgnoreCase))
              return false;
    
          return true;
        }
    
        public static Boolean InProgramFiles(String path) {
          return PathIncludes(path, Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86))); 
        }
    

    //测试:

        // Supposing that ProgramFilesX86 is "C:\Program Files (x86)"
        InProgramFiles(@"C:\PRogRAM FILES (x86)\Sample"); // <- true
        InProgramFiles(@"C:/PRogRAM FILES (x86)/Sample"); // <- true
        InProgramFiles(@"D:/PRogRAM FILES (x86)/Sample"); // <- false
        InProgramFiles(@"C:/PRogRAM FILES (x86)A/Sample"); // <- false