使用C#访问网络文件共享

时间:2013-08-14 19:46:13

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

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

2 个答案:

答案 0 :(得分:8)

一般来说,是的。一样的。按照你的说法使用UNC路径。您可能会遇到安全问题,具体取决于应用程序的运行方式,但快速测试应该类似于:

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

只需将其指向您知道存在的文件,然后查看是否找到它。您可能必须处理凭据或身份,具体取决于您的应用程序的配置。如果是这种情况,你应该得到一个Exception,声明“拒绝访问”或类似的东西。

答案 1 :(得分:0)

显然不可能。

我必须做这样的事情:

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);
    }

}