File.Copy - 网络共享 - 不同的读帐户和写帐户

时间:2016-08-19 08:37:28

标签: c# c#-4.0 .net-4.0 file-copying

我有两个网络共享,它们都有专用帐户(网络凭据)来访问它们

例如:

\ RemoteComputer1 \ Folder - user1

\ RemoteComputer2 \ Folder - user2

user1无法访问本地计算机和\ RemoteComputer2 \ Folder,与user2相同,他无法访问本地计算机和\ RemoteComputer1 \ Folder。

我需要能够做三种类型的操作:

  1. 将本地文件复制到\ RemoteComputer1 \ Folder
  2. 将文件从\ RemoteComputer1 \ Folder复制到\ RemoteComputer2 \ Folder
  3. 将文件从\ RemoteComputer1 \ Folder复制到本地文件夹
  4. 现在我使用https://github.com/mj1856/SimpleImpersonation获取源流和目标流,然后使用stream.CopyTo从源复制到目标流 以下是我目前的代码:

    public static void CopyWithCredentials(string @sourcePath, string destinationPath, NetworkCredential readUser = null, NetworkCredential writeUser = null)
    {
        //same user, do normal File.Copy
        if (readUser!=null && writeUser!=null && readUser == writeUser)
        {
            using (Impersonation.LogonUser(readUser.Domain, readUser.UserName, readUser.Password, LogonType.NewCredentials))
            {
                if (!Directory.Exists(Path.GetDirectoryName(destinationPath)))
                {
                    Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));
                }
                File.Copy(@sourcePath, destinationPath);
                return;
            }
        }
            FileStream sourceStream;
    
            if (readUser != null)
            {
                using (Impersonation.LogonUser(readUser.Domain, readUser.UserName, readUser.Password, LogonType.NewCredentials))
                {
                    sourceStream = new FileStream(@sourcePath, FileMode.OpenOrCreate, System.IO.FileAccess.Read);
                }
            }
            else
            {
                sourceStream = new FileStream(@sourcePath, FileMode.OpenOrCreate, System.IO.FileAccess.Read);
            }
    
            FileStream destinationStream;
    
            if (writeUser != null)
            {
                using (Impersonation.LogonUser(writeUser.Domain, writeUser.UserName, writeUser.Password, LogonType.NewCredentials))
                {
                    if (!Directory.Exists(Path.GetDirectoryName(destinationPath)))
                    {
                        Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));
                    }
    
                    while (File.Exists(destinationPath))
                    {
                        string fileName = Path.GetFileNameWithoutExtension(destinationPath);
                        string newFileName = fileName + "1";
                        destinationPath = destinationPath.Replace(fileName, newFileName);
                    }
    
                    destinationStream = File.Create(destinationPath);
                }
            }
            else
            {
                if (!Directory.Exists(Path.GetDirectoryName(destinationPath)))
                {
                    Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));
                }
                destinationStream = File.Create(destinationPath);
            }
    #warning is this enough for closing streams after copying? 
            using (sourceStream)
            {
                using (destinationStream)
                {
                    sourceStream.CopyTo(destinationStream);
                }
            }
    
            sourceStream.Dispose();
            destinationStream.Dispose();
            sourceStream = null;
            destinationStream = null;
    }
    

    我必须承认这看起来很丑陋而且过于复杂。

    问题是我在一个文件夹中有多个文件,我想将它们全部复制到第二个文件夹。使用我的方法,我为每个文件调用LogonUser两次。对于1000个文件,我必须称它为2000次。理想情况下,我想拨打LogonUser两次(第一个文件夹,第二个文件夹第二个文件夹)并复制#34;会话"中的所有文件。

    我想使用File.Copy,因为它使用本机kernel32.dll函数(https://stackoverflow.com/a/1247092/965722)和I found out in same question File.Copy自Vista SP1以来有了很大改进。

    同样I found有关File.Copy和Stream速度的问题,看起来它们应该相等,因为File.Copy正在使用流。

    我的问题是:如果不使用流,这可以更简单吗?

    我不想创建可随处访问的超级管理员帐户 我想避免使用WNetUseConnection,因为it can leave open connections 我不想按照this question的评论中提到的每个文件添加权限。

0 个答案:

没有答案