разрешение вопроса ??? с использованием System.IO.File.Exists - PullRequest
1 голос
/ 23 мая 2019

У меня есть приложение winform .net 4, которое для одного компьютера System.IO.File.Exists («путь к моему файлу»), которое каждый раз возвращает false.

  1. Файл там.
  2. Если пользователь с помощью проводника файлов может видеть, открывать, сохранять ... файл и имеет полный доступ к папке.
  3. Я сделал отдельное приложение winforms, которое имеет очень простой код (см. Ниже), и оно работает. Этот же файл найден.

Вот код:

If System.IO.File.Exists(txtPath.Text) Then
    lblResults.BackColor = Color.Green
    lblResults.Text = "Found"
Else
    lblResults.BackColor = Color.Red
    lblResults.Text = "No Joy"
End If

Я также в приложении, которое не работает, использую стороннюю dll для чтения почтового ящика imap. Опять этот компьютер выдает ошибку при попытке сохранить вложения в корне по тому же пути, ошибка ниже

saveAttachedFile:
  index: 0
  dir: Z:\XXX\Email\Attachments\6b333c68-4382-438c-99db-51a13ad1d71a\Attachments\
  ensureDir:
    createDirWin32:
      WindowsError: The system cannot find the path specified.
      WindowsErrorCode: 0x3
    --createDirWin32
    createDirWin32:
      WindowsError: The system cannot find the path specified.
      WindowsErrorCode: 0x3
    --createDirWin32
    Cannot ensure directory existence (2)
    path: Z:\XXX
  --ensureDir
  Directory does not exist and cannot be created.
  directory: Z:\CVO\Email\Attachments\6b333c68-4382-438c-99db-51a13ad1d71a\Attachments\
--saveAttachedFile

так что, похоже, это проблема с разрешениями. Но с другой стороны, пользователь / компьютер имеет доступ к нему через проводник или 2-е приложение .net, которое только проверяет наличие файла?

Я не уверен, что еще можно попробовать. Любые предложения помощи будут по-настоящему оценены.

Попробовал это несколько компьютеров в домене, и все они работают. Попробовали разные пользователи, входящие в систему компьютера на ту же проблему. Файл не найден Запустил 1-е приложение в качестве администратора той же проблемы, файл не найден.

    If System.IO.File.Exists(txtPath.Text) Then
        lblResults.BackColor = Color.Green
        lblResults.Text = "Found"
    Else
        lblResults.BackColor = Color.Red
        lblResults.Text = "No Joy"
    End If

System.IO.File.Exists (txtPath.Text) возвращает False в одном приложении, но True во втором

1 Ответ

0 голосов
/ 23 мая 2019

Прежде всего, просто не звоните File.Exists().Есть много вещей, которые могут привести к сбою доступа к файлу, даже когда File.Exists() возвращает true, так что то, что вы действительно можете при вызове этой функции, - это целая дополнительная поездка на диск ... что с точки зрения компьютера является медленным.Очень медленно.Невероятно медленныйИ вам все равно придется обрабатывать исключение, когда оно выходит из строя.

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


Это не так ... возможно, проблема с разрешениями все еще существуетздесь, хотя я думаю, что реальная проблема немного другая.Я заметил, что в коде используется путь для диска Z:, который, скорее всего, является диском, привязанным к серверу, и упоминается домен.Теперь мне интересно, как работает код, потому что подключенные диски работают по-разному.

Обычно подключенные диски существуют как пользовательские конструкции, а не как системная конструкция (возможно, для создания подключенных дисков насистемный уровень, но это совсем не нормально или не рекомендуется, и они обычно не работают так, как вы ожидаете), так что разные пользователи могут иметь один и тот же диск, сопоставленный с разными местами, или один пользователь может сопоставить один и тот же диск и местоположение, используя разныеучетные данные, чтобы получить другой доступ, или один пользователь может иметь сопоставленный диск, а другой нет.И это может произойти, даже если у обоих пользователей есть активные сеансы на компьютере.

Точка обычно подключается к дискам не существует в определенных контекстах, если только вы не выполняете дополнительную работу, чтобы сделать их доступными,Это вроде как разрешения, но не совсем;это не вам было отказано в доступе, а подключенный диск просто не существует в этом контексте.Они не будут отображаться для запланированных задач, служб Windows, запуска от имени другого пользователя (иногда) и других ситуаций, которые я, вероятно, забыл.Часто даже запуска службы или задачи от одного и того же пользователя недостаточно, если пользователь еще не выполнил интерактивный вход в систему на компьютере.В этих случаях вам нужно использовать UNC \\server\share путь.

Это также хорошо согласуется с зарегистрированной ошибкой:

Системе не удается найти указанный путь.

Она не говорит, что вам было отказано в доступе, а точнее даже не смог его найти.Как будто путь ... не существует.Кроме того, это объясняет проблему «не может быть создано»;вы не можете создать каталог на диске, который не существует.

...