С# Каталог не существует ошибки, когда он существует

Как понятно из заголовка, у меня есть программа, которая проверяет, существует ли каталог, прежде чем продолжить.

И когда проверка сделана, она говорит, что каталог не существует, когда он существует!

Вот код для сохранения пути к каталогу:

string currentDirectory = Path.GetDirectoryName(Application.ExecutablePath);
Console.WriteLine("----" + currentDirectory.ToString());
string tesseractPath = Path.Combine(currentDirectory, @"..\..\..\tesseract");
_wrapper = new AsyncTesseractWrapper(tesseractPath);



public TesseractWrapper(string programLoc)
{
    DirectoryInfo dinfo = new DirectoryInfo(programLoc);
    //DirectoryInfo dinfo = new DirectoryInfo("C:\\Windows");
    ValidateTesseractDirectory(dinfo);
    _tesseractLocation = dinfo.FullName;
}

И код для выполнения проверки:

private void ValidateTesseractDirectory(DirectoryInfo dinfo)
{
    if (!dinfo.Exists)               
        throw new ArgumentException("Specified program directory must exist.");
    FileInfo[] files;
    files = dinfo.GetFiles(_tessExe);
    if (files.Length != 1)
        throw new ArgumentException("Specified program directory must contain tesseract.exe.");
}

Я пробовал отлаживать несколько вариантов, например проверять, существует ли папка C:\Windows, но она все равно выдает ошибку...

Что-то не так с кодом или моим пониманием метода .Exists...?

Спасибо!


person Sulaiman    schedule 23.11.2012    source источник
comment
Я не вижу ничего явно плохого. Что возвращает Directory.Exists()? Есть ли в вашей среде что-то необычное, например, виртуальная машина?   -  person Patrick Quirk    schedule 23.11.2012
comment
Каково фактическое tesseractPath вычисленное значение?   -  person Steve B    schedule 23.11.2012
comment
.Exist возвращает логическое значение (в зависимости от того, существует оно или нет). А ВМ нет. Хотя я только что понял, что должен попробовать тот же метод на чистом проекте... Но в этом тоже нет ничего плохого.   -  person Sulaiman    schedule 23.11.2012
comment
@SteveB Если я console.writeline это, это то, что я получаю (довольно длинно): C:\Users\Sulaiman\Desktop\Programming\Visual Studio 2010\Projects\PDF_Image_to_Excel_Converter\Image-OCR\Atlasoft\TesseractLancher Files\tesseract И это действительно существует . Я мог скопировать / вставить его в проводник, и папка открылась.   -  person Sulaiman    schedule 23.11.2012
comment
@Sulaiman.89 если ваш путь уже такой длинный, и вы запускаете код из четырех каталогов ниже этого, возможно, вы сталкиваетесь с проблемами максимальной длины пути. Win7 имеет максимум 260. Попробуйте переместить свой проект в c:\MySweetProject\ и посмотрите, получите ли вы такие же результаты.   -  person drch    schedule 23.11.2012
comment
@Eren Ersönmez был прав в моем случае. Мое веб-приложение IIS (домен приложения, который был запущен с правами пользователя iis) не имеет разрешения на чтение файлов папок, поэтому оно возвращает false из-за исключения отсутствия разрешений   -  person Vladimir Shmidt    schedule 19.06.2014


Ответы (3)


Это может быть из-за проблемы с разрешениями. Чтобы процитировать MSDN:

Свойство Exists возвращает false, если возникает ошибка при попытке определить, существует ли указанный файл. Это может произойти в ситуациях, вызывающих исключения, например, при передаче имени файла с недопустимыми символами или слишком большим количеством символов, неисправном или отсутствующем диске или если у вызывающего объекта нет разрешения на чтение файла.

person Eren Ersönmez    schedule 23.11.2012
comment
Имеет смысл, но ни одно из этих исключений не применимо к этому случаю... У меня есть полный доступ и я не использую недопустимые символы. - person Sulaiman; 23.11.2012

Я думаю, проблема в том, что Microsoft изменила структуру папок, и «очевидно» их сотрудники все еще смотрят «по-старому». В прошлом у папки был «..», который был «меткой папки» (конечно, dos). Я вижу, что этого больше не существует. Что я сделал: я поместил / скопировал фиктивный файл в новую папку, изображение или что-то еще, и вместо «каталога» я использую file.exists. Я думаю, что ответ может быть в атрибутах.

person Pat    schedule 13.06.2013

Собственно то же самое испытал. Это было связано с использованием soft link (текстовый файл с информацией о папке) вместо соединения.

Загрузите рекурсивно сначала папку, затем их файлы и исправьте неправильное соединение. длинные имена файлов и т.д.

public static List<string> GetFilesEveryFolder(string folder, string mask, SearchOption searchOption, bool _trimA1 = false)
{
    List<string> list = new List<string>(); ;
    List<string> dirs = null;

    try
    {
        dirs = GetFoldersEveryFolder(folder, "*").ToList();
    }
    catch (Exception ex)
    {
        throw new Exception("GetFiles with path: " + folder, ex);
    }

    foreach (var item in dirs)
    {
        try
        {
            list.AddRange(Directory.GetFiles(item, mask, SearchOption.TopDirectoryOnly));
        }
        catch (Exception ex)
        {
            // Not throw exception, it's probably Access denied on Documents and Settings etc
            //ThrowExceptions.FileSystemException(type, RH.CallingMethod(), ex);
        }
    }

    CA.ChangeContent(list, d => SH.FirstCharLower(d));

    if (_trimA1)
    {
        list = CA.ChangeContent(list, d => d = d.Replace(folder, ""));
    }
    return list;
}
person sunamo.cz    schedule 09.10.2019