【问题标题】:Copy a file from local drive to shared drive using C#使用 C# 将文件从本地驱动器复制到共享驱动器
【发布时间】:2016-12-28 16:24:27
【问题描述】:

我想将文件从本地驱动器复制到共享网络路径。

我尝试了以下方法:

string remoteUserName = 
          WebConfigurationManager.AppSettings["remoteUsername"].ToString();
string remotePassword =
          WebConfigurationManager.AppSettings["remotePassword"].ToString();
string remoteDomain = 
          WebConfigurationManager.AppSettings["remoteDomain"].ToString();
string remoteFilePath = 
          WebConfigurationManager.AppSettings["remoteFilePath"].ToString();

using (var impersonation = new 
          ImpersonatedUser(remoteUserName, remoteDomain, remotePassword))
{
    CreateErrorLog("Logged in successfully - User and password are correct.", 
                   "Action" + " - " + "controllerName");
    string filePath = remoteFilePath;
    string fileName = "txt.txt";
    StreamWriter SW1;
    FileIOPermission myPerm = new 
               FileIOPermission(FileIOPermissionAccess.AllAccess, filePath + fileName);
    myPerm.Assert();
    SW1 = System.IO.File.CreateText(filePath + fileName);
}

【问题讨论】:

标签: c#


【解决方案1】:

好的,让我们稍微处理一下这段代码。首先让我们简化构建路径。我们有一个网络路径和一个本地路径。根据您当前的代码,网络路径是使用几个变量comboBox1、comboBox2 和Environment.UserName 构建的,所以让我们做一些不同的事情:

var networkPath = Path.Combine(@"\\network",
    comboBox1.SelectedItem as string,
    comboBox2.SelectedItem as string,
    Environment.UserName);

这将正确地将 \ 放在每个字符串之间(即,如果已经有一个反斜杠,它就不会添加一个,但如果有必要的话会添加)。

现在让我们对本地路径做同样的事情:

var localPath = Path.Combine(@"C:\Users",
    Environment.UserName,
    "test",
    label5.Text);

好的,我们快到了,但我们还有一条替代网络路径:

var alternativeNetworkPath = Path.Combine(@"\\atlanta2-0\it-documents\filestroage",
    comboBox1.SelectedItem as string,
    comboBox2.SelectedItem as string,
    Environment.UserName,
    label5.Text);

现在,我已经怀疑这条路径的一件事是,\filestroage,它实际上拼写错误。现在,如果文件夹的拼写很好,但我想知道它是否拼写错误。所以看看吧。好吧,让我们继续,现在我们已经构建了所有三个路径,它更容易阅读,我们可以轻松输出这些字符串以确保它们是正确的。我们来看看逻辑。它是这样说的,如果 networkPath 存在,则将其保存在那里,但是,如果它不存在,则创建它并将其保存到 AlternativeNetworkPath。所以让我们这样做:

if (Directory.Exists(networkPath))
{
    File.Copy(localPath, networkPath);
}
else
{
    Directory.CreateDirectory(networkPath);
    File.Copy(localPath, alternativeNetworkPath);
}

好吧,够简单了吧?但是您说 Directory.Exists 即使存在,它也会返回 true。这几乎是预期的不是吗?如果目录存在,则此方法肯定会返回 true,如果不存在,则返回 false。然后,您使用 Directory.CreateDirectory 声明上面的行说找不到网络名称 - 这只能意味着路径构造错误。

所以在分解它之后,底线是这样的,正在构建的路径必须是一时兴起。但是,使用这种新模型,您应该能够更轻松地拉出这些路径。所以在我看来,整个方法看起来像这样:

var networkPath = Path.Combine(@"\\network",
    comboBox1.SelectedItem as string,
    comboBox2.SelectedItem as string,
    Environment.UserName);

var localPath = Path.Combine(@"C:\Users",
    Environment.UserName,
    "test",
    label5.Text);

var alternativeNetworkPath = Path.Combine(@"\\atlanta2-0\it-documents\filestroage",
    comboBox1.SelectedItem as string,
    comboBox2.SelectedItem as string,
    Environment.UserName,
    label5.Text);

if (Directory.Exists(networkPath))
{
    File.Copy(localPath, networkPath);
}
else
{
    Directory.CreateDirectory(networkPath);

File.Copy(localPath, alternativeNetworkPath);
}

所以现在让我们看看这些变量中的路径,你的问题应该马上就会出现。

【讨论】:

    【解决方案2】:

    通过完整的通用命名约定-UNC \\Server\Share\drive\file 路径访问网络路径。如果您拥有这些类型的凭据或访问网络的权限,您可以使用 File.Copy 方法来移动您的文件。

    【讨论】:

    • \\server,而不是 \server,根据 UNC 命名约定。
    • 看来他需要冒充,所以这行不通。
    • 那我该如何实现呢?
    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多