我有两个网络共享,它们都有专用帐户(网络凭据)来访问它们
例如:
\ RemoteComputer1 \ Folder - user1
\ RemoteComputer2 \ Folder - user2
user1无法访问本地计算机和\ RemoteComputer2 \ Folder,与user2相同,他无法访问本地计算机和\ RemoteComputer1 \ Folder。
我需要能够做三种类型的操作:
现在我使用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的评论中提到的每个文件添加权限。