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