File.Exists возвращает false, даже если файл присутствует в папке - PullRequest
0 голосов
/ 03 апреля 2019
bool a = File.Exists(archiveDetail["downloadPath"]);

Для a всегда задано значение false, даже если указанный файл присутствует в расположении, когда я отлаживаю и копирую путь к файлу и вставляю его в проводник, файл присутствует и его открытие, но этот методвозвращает ложьКроме того, длина пути к файлу составляет 309 символов, это причина этого?

Должна ли длина пути к файлу быть менее 260 символов?Также я изменил app.confing для рассмотрения файлов с длинными путями:

<runtime>
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
</runtime>

Почему File.Exists () возвращает false?

Пытался обрабатывать пути к файлам с более чем260 символов.PS - длина имени файла составляет 134 символа.

Я также пробовал это [ссылка] Хотя все еще не работает.

Этот путь генерируется, когдаотладка, когда я вставляю это в проводник, открывается файл:

C:\Users\a.bhis\Documents\GitHub\Solutio-2000\Solutio\Solutio\Content\SDKs\web\Z10_\Solutions_ZC_265\Zrbeqtqdqkuqenle\SolutionExploer\ABC Privateino\Bhar\CasisInfo\ddtp___p123palsis01.extern_botgurndne_comfi_handbuerer_silly_zzp-e.nsf_5_ZZ73860ZZEZZZ8CZ6701244Z4646_$file_Lassiv+BN2+11-1999.pdf

1 Ответ

0 голосов
/ 04 апреля 2019

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

Для метода File.Exist () вы можете использоватьэтот альтернативный метод:

  if (!CheckPath(archiveDetail["downloadPath"]))
     {
      throw new Exception("The export file does not exist!");
    }

 public bool CheckPath(string path)
        {
            if (path.Length >= MAX_PATH)
            {
                return checkFile_LongPath(path);
            }
            else if (!File.Exists(path))
            {
                return false;
            }
            return false;
        }

private bool checkFile_LongPath(string path)
        {
            string[] subpaths = path.Split('\\');
            StringBuilder sbNewPath = new StringBuilder(subpaths[0]);
            // Build longest subpath that is less than MAX_PATH characters
            for (int i = 1; i < subpaths.Length; i++)
            {
                if (sbNewPath.Length + subpaths[i].Length >= MAX_PATH)
                {
                    subpaths = subpaths.Skip(i).ToArray();
                    break;
                }
                sbNewPath.Append("\\" + subpaths[i]);
            }
            DirectoryInfo dir = new DirectoryInfo(sbNewPath.ToString());
            bool foundMatch = dir.Exists;
            if (foundMatch)
            {
                // Make sure that all of the subdirectories in our path exist.
                // Skip the last entry in subpaths, since it is our filename.
                // If we try to specify the path in dir.GetDirectories(), 
                // We get a max path length error.
                int i = 0;
                while (i < subpaths.Length - 1 && foundMatch)
                {
                    foundMatch = false;
                    foreach (DirectoryInfo subDir in dir.GetDirectories())
                    {
                        if (subDir.Name == subpaths[i])
                        {
                            // Move on to the next subDirectory
                            dir = subDir;
                            foundMatch = true;
                            break;
                        }
                    }
                    i++;
                }
                if (foundMatch)
                {
                    foundMatch = false;
                    // Now that we've gone through all of the subpaths, see if our file exists.
                    // Once again, If we try to specify the path in dir.GetFiles(), 
                    // we get a max path length error.
                    foreach (FileInfo fi in dir.GetFiles())
                    {
                        if (fi.Name == subpaths[subpaths.Length - 1])
                        {
                            foundMatch = true;
                            break;
                        }
                    }
                }
            }
            // If we didn't find a match, write to the console.
            if (!foundMatch)
            {
                return false;
            }
            return foundMatch;
        }

Это по ссылке LongFileIssue

Проблема чтения файла может быть решена с использованием файла альтернативного класса LongPath, как упоминалосьв этом блоге

Однако при использовании FileStream необходимо указать имя файла, поскольку имя FileStream в LongPath не будет таким, как требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...