将本地文件复制到网络共享驱动器问题

时间:2013-04-04 02:53:46

标签: c# winforms

我使用下面的代码检查网络驱动器上是否存在目录。如果是,我复制文件;如果不是我创建目录,然后将其复制。但是我遇到了问题。任何帮助将不胜感激。主要问题是IO异常,其中包含无法找到网络名称的消息。另外,我的savelocation变量看起来好像斜杠没有被转义。

string savelocation = @"\\network\" + comboBox1.SelectedItem + "\\" +
    comboBox2.SelectedItem+"\\"+Environment.UserName;

// When I check what savelocation is, it returns the unescaped string
// for example \\\\network\\ and so on

if (Directory.Exists(savelocation)) // this returns true even if it exists
{
    File.Copy(@"C:\Users\" + Environment.UserName + @"\test\" + label5.Text,
        savelocation + "\\" + label5.Text);
}
else {
    DirectoryInfo d = Directory.CreateDirectory(savelocation);
    // The line above says the network name cannot be found

    File.Copy(@"C:\Users\" + Environment.UserName + @"\test\" + label5.Text,
        "\\\\atlanta2-0\\it-documents\\filestroage\\" + comboBox1.SelectedItem +
        "\\" + comboBox2.SelectedItem + "\\" + Environment.UserName + label5.Text);
}

1 个答案:

答案 0 :(得分:13)

好的,让我们稍微处理一下这段代码。首先让我们简化构建路径。我们有一个网络路径一个本地路径。根据您当前的代码,网络路径是使用一些变量comboBox1comboBox2Environment.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 even if it exists。这是非常期待的不是吗?如果目录存在,那么此方法肯定会返回true,否则返回false。然后,您使用Directory.CreateDirectory表示The line above says the network name cannot be found - 只能表示路径构造错误。

因此,在分解之后,底线是这样,正在构建的路径必须脱离tidge。但是,使用这个新模型,您应该能够轻松地将这些路径拉出 因此,在我看来,整个方法看起来像这样:

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

所以现在让我们看看这些变量中的那些路径,你的问题应该出来了。