Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将本地文件复制到网络共享驱动器问题_C#_Winforms - Fatal编程技术网

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

C# 将本地文件复制到网络共享驱动器问题,c#,winforms,C#,Winforms,我使用下面的代码检查网络驱动器上是否存在目录。如果有,我复制文件;如果没有,我创建目录,然后复制它。然而,我有问题。任何帮助都将不胜感激。主要问题是IO异常,消息为“找不到网络名称”。另外,如果斜杠没有被转义,我的savelocation变量看起来就像这样 string savelocation = @"\\network\" + comboBox1.SelectedItem + "\\" + comboBox2.SelectedItem+"\\"+Environment.UserNam

我使用下面的代码检查网络驱动器上是否存在目录。如果有,我复制文件;如果没有,我创建目录,然后复制它。然而,我有问题。任何帮助都将不胜感激。主要问题是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);
}

好的,让我们稍微研究一下这段代码。首先,让我们简化构建路径。我们有一条网络路径和一条本地路径。根据您当前的代码,网络路径是由几个变量构建的,
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
,它实际上拼写错误。现在,如果文件夹的拼写是那样的话,我想知道它是否拼写错误。那就看看吧。好的,让我们继续,现在我们已经构建了所有三条路径,它更容易阅读,并且我们可以轻松地将这些字符串输出到以确保它们是正确的。让我们来看看这个逻辑。它这样说,如果
网络路径存在,则将其保存在那里,但是,如果它不存在,则创建它并将其保存到
备选网络路径
,那么让我们这样做:

if (Directory.Exists(networkPath))
{
    File.Copy(localPath, networkPath);
}
else
{
    Directory.CreateDirectory(networkPath);
    File.Copy(localPath, alternativeNetworkPath);
}
好吧,很简单,是吗?但是您声明,
目录.Exists
正在返回true
,即使它存在。这几乎是意料之中的事,不是吗?如果目录存在,则此方法肯定会返回
true
,如果不存在,则将返回
false
。然后,您用
目录.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);
}

现在,让我们看看这些变量中的路径,您的问题应该会迎刃而解。

当然,只要您告诉我们问题的确切原因……您可以使用Windows资源管理器浏览到
\\network