-2

以下のコードを使用して、ネットワーク ドライブにディレクトリが存在するかどうかを確認しています。存在する場合は、ファイルをコピーします。そうでない場合は、ディレクトリを作成してからコピーします。しかし、私は問題を抱えています。どんな助けでも感謝します。主な問題は、ネットワーク名が見つからないというメッセージを伴う 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);
}
4

1 に答える 1

13

よし、このコードに少し手を加えてみましょう。まず、パスの構築を単純化しましょう。ネットワーク パスローカル パスがあります。現在のコードによると、ネットワーク パスはいくつかの変数comboBox1comboBox2、および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);

OK、あと少しですが、別のネットワーク パスもあります。

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

さて、このパスについて私がすでに疑っていることの 1 つは、\filestroage実際にはスペルが間違っていることです。さて、フォルダのスペルが正しい場合は問題ありませんが、スペルが間違っているのではないかと思います。だから見てください。よし、続けましょう。これで 3 つのパスすべてが作成されました。少し読みやすくなり、これらの文字列を簡単に出力して、それらが正しいことを確認できます。ロジックを見てみましょう。が存在する場合は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

したがって、それを分解した後、結論はこれです。構築されているパスは、少しずれている必要があります。ただし、この新しいモデルを使用すると、これらのパスをより簡単に引き出すことができるはずです。したがって、私の考えでは、メソッド全体は次のようになります。

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

それでは、これらの変数のパスを見てみましょう。問題はすぐに解決するはずです。

于 2013-04-04T03:16:20.660 に答える