1

我有一个 .net 4 winform 应用程序,对于一台计算机,System.IO.File.Exists("my file path") 每次都返回 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

我还在不工作的应用程序中使用第 3 方 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

所以这似乎是一个权限问题。但话又说回来,用户/计算机可以通过资源管理器或仅检查文件是否存在的第二个 .net 应用程序访问它?

我不确定还能尝试什么。任何帮助建议将不胜感激。

已经在域中尝试过这台多台计算机,它们都可以正常工作。试过不同的用户登录电脑出现同样的问题。找不到文件以管理员身份运行第一个应用程序同样的问题,找不到文件。

    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

4

1 回答 1

0

首先,不要打电话File.Exists()。有很多事情会导致文件访问失败,即使在File.Exists()返回true时也是如此,因此调用此函数真正完成的只是额外的磁盘之旅......在计算机方面很慢。非常慢。慢得难以想象。当它失败时,你仍然必须处理异常。

相反,只需尝试打开文件,并知道如果异常失败如何处理。这是您真正应该依赖异常处理来处理正常程序控制流的(极少数)情况之一。


顺便说一句……这里可能仍然存在权限问题,尽管我认为真正的问题略有不同。我注意到代码使用了一个驱动器的路径Z:,这可能是一个映射到某处服务器的驱动器,并提到了一个域。现在我想知道代码是如何运行的,因为映射驱动器的工作方式不同。

映射驱动器通常作为用户构造而不是系统构造存在(可以在系统级别创建映射驱动器,但这根本不正常或不推荐,它们通常不会像您期望的那样工作),这样不同的用户可能将相同的驱动器映射到不同的位置,或者一个用户可能使用不同的凭据映射相同的驱动器和位置以获得不同的访问权限,或者一个用户可能映射了一个驱动器,但另一个用户没有。即使两个用户在计算机上都有活动会话,这种情况也可能发生。

关键是映射驱动器通常在某些情况下不存在,除非您做额外的工作以使它们可用。这有点像权限,但不完全是;不是您被拒绝访问,而是映射驱动器在此上下文中不存在。它们不会出现在计划任务、Windows 服务、以其他用户身份运行(有时)以及我可能忘记的其他情况。通常,如果用户尚未在计算机上进行交互式登录,即使以同一用户身份运行服务或任务也是不够的。在这些情况下,您需要使用 UNC\\server\share路径。

这也很好地映射到记录的错误:

该系统找不到指定的路径。

它并不是说您被拒绝访问,而是它甚至找不到它。几乎就像路径......不存在一样。此外,它还解释了“无法创建”的问题;您不能在不存在的驱动器上创建目录。

于 2019-05-23T18:49:52.923 回答