.NET, Как проверить, является ли путь файлом и не каталогом?

Что вы можете сделать, просто создайте свою собственную функцию console.log с возвратом, чтобы изменить это поведение при большом количестве кодирования в консоли разработчика. Вот пример того, что выглядит в консоли разработчика:

console.log('I hate seeing the next line stating the obvious.')
I hate seeing the next line stating the obvious.
undefined
log = function(l){return l}
function log()
if(1 === 2){console.log('1 is not equal to 2.')}else{log('No Shit Sherlock.')}
"No Shit Sherlock."
72
задан David Basarab 13 January 2009 в 15:45
поделиться

7 ответов

Использование:

System.IO.File.GetAttributes(string path)

и проверяют, содержит ли возвращенный FileAttributes результат значение FileAttributes.Directory:

bool isDir = (File.GetAttributes(path) & FileAttributes.Directory)
                 == FileAttributes.Directory;
111
ответ дан Alnitak 7 November 2019 в 08:21
поделиться

Я думаю, что это - самый простой путь, где Вам только нужны две проверки:

string file = @"C:\tmp";
if (System.IO.Directory.Exists(file))
{
    // do stuff when file is an existing directory
}
else if (System.IO.File.Exists(file))
{
    // do stuff when file is an existing file
}
53
ответ дан Mo Patel 7 November 2019 в 08:21
поделиться

Можно сделать это с некоторым кодом interop:

    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
    [return: MarshalAsAttribute(UnmanagedType.Bool)]
    public static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);

Для дальнейшего разъяснения некоторых комментариев...

Представляющий неуправляемый код в этом не больше по сути опасен, чем ни один другой файл или связанные с вводом-выводом вызовы в.NET, так как они в конечном счете все призывают к неуправляемому коду.

Это - единственный вызов функции с помощью строки. Вы не представляете новых типов данных и/или использования памяти путем вызывания этой функции. Да, действительно необходимо полагаться на неуправляемый код для надлежащей чистки, но у Вас в конечном счете есть та зависимость от большинства связанных с вводом-выводом вызовов.

Для ссылки, вот код в Файл. GetAttributes (представляют путь в виде строки) от Отражателя:

public static FileAttributes GetAttributes(string path)
{
    string fullPathInternal = Path.GetFullPathInternal(path);
    new FileIOPermission(FileIOPermissionAccess.Read, new string[] { fullPathInternal }, false, false).Demand();
    Win32Native.WIN32_FILE_ATTRIBUTE_DATA data = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA();
    int errorCode = FillAttributeInfo(fullPathInternal, ref data, false, true);
    if (errorCode != 0)
    {
        __Error.WinIOError(errorCode, fullPathInternal);
    }
    return (FileAttributes) data.fileAttributes;
}

, Как Вы видите, это также призывает к неуправляемому коду для получения атрибутов файла, таким образом, arguements о представлении неуправляемого кода, являющегося опасным, недопустимы. Аналогично, аргумент о пребывании полностью в управляемом коде. Нет никакой реализации управляемого кода, чтобы сделать это. Даже вызов Файла. GetAttributes () как другие ответы делают предложение, имеют те же "проблемы" вызова unmanged код, и я полагаю, что это - более надежный метод для выполнения определения, если путь является каталогом.

Редактирование Для ответа на комментарий @Christian K о CAS. Я верю единственной причине, GetAttributes делает спрос на безопасность, то, потому что это должно считать свойства файла, таким образом, это хочет удостовериться, что код вызова имеет разрешение сделать так. Это не то же как базовые проверки ОС (если существует кто-либо). Можно всегда создавать функцию обертки вокруг вызова P/Invoke к PathIsDirectory, который также требует определенные полномочия CAS при необходимости.

10
ответ дан Scott Dorman 7 November 2019 в 08:21
поделиться

Принятие каталога существует...

bool isDir = (File.GetAttributes(path) & FileAttributes.Directory)
                  == FileAttributes.Directory;
7
ответ дан Dirk Vollmar 7 November 2019 в 08:21
поделиться

Проверьте это:

/// <summary>
/// Returns true if the given file path is a folder.
/// </summary>
/// <param name="Path">File path</param>
/// <returns>True if a folder</returns>
public bool IsFolder(string path)
{
    return ((File.GetAttributes(path) & FileAttributes.Directory) == FileAttributes.Directory);
}

от http://www.jonasjohn.de/snippets/csharp/is-folder.htm

3
ответ дан Dror 7 November 2019 в 08:21
поделиться

Считайте атрибуты файла:

FileAttributes att = System.IO.File.GetAttributes(PATH_TO_FILE);

Проверка на флаг Directory .

2
ответ дан Igor Zelaya 7 November 2019 в 08:21
поделиться

Учитывая, что конкретная строка пути не может представить обоих каталог и файл, тогда следующее работает просто великолепно и открывает дверь для других операций.

bool isFile = new FileInfo(path).Exists;
bool isDir = new DirectoryInfo(path).Exists;

, Если Вы работаете с файловой системой, с помощью FileInfo и DirectoryInfo, намного более просто, чем использование строк.

1
ответ дан Drew Noakes 7 November 2019 в 08:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: