2014-02-13 5 views
1

Как проверить на C#, если конкретный путь указан в каталоге в «Program Files»?Проверьте, находится ли путь в программных файлах

C: \ Program Files \ someDir ... -> в Program Files

D: \ Apps \ someDir ... -> не в Program Files

Спасибо!

+0

Пробовали ли вы что-нибудь? Как получить путь в виде строки и проверить, содержит ли он «файлы программы»? –

+0

Немного непонятно. Вы говорите, что с учетом определенного каталога вы хотите проверить, существует ли он в корневом каталоге Program Files? – Yuck

ответ

5

Вы можете проверить путь в ProgramFiles (x86), используя код ниже:

string path = "yourpath"; 


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

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

Я никогда не знал о перечислении 'Environment.SpecialFolder'. Очень приятное предложение. –

+0

@JonSenchyna Надеюсь, это поможет –

+1

Извините, но есть встречный пример: «C: \ Program Files (x86) 123 \ Test« нет в »C: \ Program Files (x86)« –

1

Прежде всего вам нужно получить путь к файлам программ. Вы можете сделать это с System.Environment:

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

Если вы хотите 32 разрядную программу файлы путь вы бы просто изменить специальную папку, которую вы ищете (System.Environment.SpecialFolder.ProgramFilesX86). Затем я сделаю a:

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

Это должно дать вам 90% пути туда хотя бы! Удачи!

EDIT/Sanitize Примечание

В качестве примечания - есть ситуации, в которых вы можете иметь действительный вход и это еще не соответствуют. Например, используя «/» вместо «\». Если вы хотите, чтобы вы правильно обрабатывали эти граничные случаи, вы можете создать объект «DirectoryInfo» из своей строки ввода, проверить, что это фактически папка, а также стандартизировать форматирование для нее. Этот код выглядит примерно так:

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

В этом примере «inputPath» такой же, как «myPath» был выше. Это должно сделать умеренно хорошую работу по дезинфекции материалов. Удачи!

+0

Еще раз, пример счетчика: «C: \ Program Files (x86) 123 \ Test», который не находится в «C: \ Program Files (x86)»; Другая проблема заключается в том, что «C:/Program Files (x86)/Test» (обратите внимание на косые черты \ и /) должны быть в «C: \ Program Files (x86)» –

+0

Для таких ситуаций - или где находится папка, будучи проверенным, является сетевым ресурсом и сопоставленным диском, который вы правы, это не будет идеальным. Вот почему я сказал 90% пути. Вероятно, необходима некоторая входная санитария (или OP может использовать объект «DirectoryInfo», чтобы сделать это для вас). Я добавлю короткую заметку об этом –

0

Если у вас есть переменная пути:

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

Вы можете проверить, если он находится в папке subfolder таким образом:

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

Обратите внимание, что в более сложных случаях .. может Reve к.т. вас из поддиректории, что означает, что вы не в папке f2 если у вас есть что-то вроде этого:

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

.. будет ударное вас обратно в это родительская папка f1.

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

{

}

+0

Путь не будет равен программные файлы. Путь - это * внутри * программные файлы ... –

+0

@drew_w Спасибо, я редактировал свой код. – Guilherme

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.ProgramFiles и SpecialFolder.ProgramFilesx86.

Заслуга Toan Nguyen для кода, чтобы получить каталог ProgramFiles:

0

Там ты некоторые interseting и тонких проблем с проблемой:

  1. Вы должны сравнить пути случай insenstive, например "C:\PRogRAM FILES (x86)\Sample" ОК
  2. Сепараторы может быть либо/или \ так "C:/PRogRAM FILES (x86)/Sample" порядке, а также
  3. Вы должны перерыв на separatos только, например "C:\Program Files (x86)MyData\Sample" не в порядке

Кодекс:

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 
Смежные вопросы