【问题标题】:Accessing a network file share with C#使用 C# 访问网络文件共享
【发布时间】:2013-08-16 22:44:04
【问题描述】:

我以前从未这样做过,我所做的所有研究都表明需要用户名/密码。情况如下:我正在为我的公司开发一个应用程序,该应用程序需要访问网络上的文件共享。我们称该文件共享为\\server\TPK。我的应用程序需要从此共享的此文件夹中获取文件。在公司网络上使用文件共享是否与使用文件 I/O (System.IO) 相同?谁能给我有关如何执行此操作的任何指导?我知道这可能是一个基本问题,对此我深表歉意。

【问题讨论】:

标签: c# http file-io .net fileshare


【解决方案1】:

一般来说,是的。一样的。只需使用您所说的UNC路径。根据您的应用程序的运行方式,您可能会遇到安全问题,但快速测试应该是这样的:

FileInfo myFile = new FileInfo(@"\\server\TPK\some-file-that-exists.pdf");
bool exists = myFile.Exists;

只需将其指向您知道存在的文件,然后查看它是否找到它。根据应用程序的配置,您可能必须处理凭据或身份。如果是这种情况,您应该得到一个异常,说明“拒绝访问”或类似的内容。

【讨论】:

  • 在我的情况下,FileInfoExists 属性为 true,但是当我尝试为同一路径创建 File 对象时,我得到一个 AccessDenied 异常!
  • 好的,它现在对我有用。我在打开文件时假设 FileAccess 将是 Read,如果未指定,但当我明确指定它时,我可以访问文件以进行读取。
  • 由于某种原因,在使用 File.Exists("Some path...") 时它失败了,我把头发拉了出来,因为我过去曾用它来成功测试文件共享。然而,您的方法已经取而代之,很有趣。
【解决方案2】:

显然不可能。

我不得不这样做:

public class SharedLocationConnector : IDisposable
{
    char driveLetter;
    bool disposed = false;

    public char ConnectToLocation(string path, string userName, string pwd)
    {
        driveLetter = MapShare(path, userName, pwd);
        Thread.Sleep(2000); //It takes that much for connection to happen
        return driveLetter;
    }

    private char MapShare(string path, string username, string pwd)
    {
        char driveLetter = GetAvailableDriveLetter();
        string cmdString = "net use " + driveLetter + ": " + path + ((username != string.Empty) ? " /user:" + username + " " + pwd : "");
        ManagementClass processClass = new ManagementClass("Win32_Process");
        object[] methodArgs = { cmdString, null, null, 0 };
        object result = processClass.InvokeMethod("Create", methodArgs);
        return driveLetter;
    }

    public void  Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    private void Dispose(bool disposing)
    {
        if (!disposed)
        {
            //Dispose managed objects. Thre are none.

            //Dispose unmanaged objects
            if (!String.IsNullOrWhiteSpace(driveLetter.ToString()))
                FileUtils.DisconnectSambaShare(driveLetter);
            disposed = true;
        }
    }

    ~SharedLocationConnector()
    {
        Dispose(false);
    }

    public void Disconnect()
    {
        if (!String.IsNullOrWhiteSpace(driveLetter.ToString()))
            DisconnectShare(driveLetter);
    }

    private void DisconnectShare(char driveLetter)
    {
        string cmdString = "net use " + driveLetter + ": /DELETE";
        ManagementClass processClass = new ManagementClass("Win32_Process");
        object[] methodArgs = { cmdString, null, null, 0 };
        object result = processClass.InvokeMethod("Create", methodArgs);
    }

}

【讨论】:

  • 我不需要在这个复杂的地方做任何事情......我只是简单地使用普通的System.IO 来访问共享,正如另一个答案所暗示的......我想知道你为什么必须实施这么复杂的东西?
  • 在执行代码之前不需要预先连接到 UNC 路径吗?
  • 我不确定您所说的预连接是什么意思...如果应用程序用于访问共享的服务帐户有权这样做,那么我想它不会是问题。
  • 是的。但我的情况是服务帐户无权共享。用户 ID 和密码必须从应用程序的配置中传递。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
相关资源
最近更新 更多