6

私はこれについてインターネット全体でグーグルで検索しましたが、まだ解決策を見つけていません。究極の試みとして、誰かが私に正確な答えをくれることを願っています。

自分で行おうとしているファイルエクスプローラーでディレクトリから別のディレクトリにファイルをコピーしようとすると、このエラーが発生します。ディレクトリを参照するためのツリービューコントロールと、ディレクトリの内容を表示するためのリストビューコントロールがあります。コードは部分的に次のようになります。

private void copyToolStripMenuItem_Click(object sender, EventArgs e)
    {
        sourceDir = treeView1.SelectedNode.FullPath;
        for (int i = 0; i < listView1.SelectedItems.Count; ++i)
        {
            ListViewItem l = listView1.SelectedItems[i];
            toBeCopied[i] = l.Text; // string[] toBeCopied, the place where I save the file names I want to save
        }
    }


private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
    {
        targetDir = treeView1.SelectedNode.FullPath;
        try
        {
            for (int i = 0; i < toBeCopied.Length; ++i)
            {
                File.Copy(sourceDir + "\\" + toBeCopied[i], targetDir + "\\" + toBeCopied[i], true);
                refreshToolStripMenuItem_Click(sender, e);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message + Environment.NewLine + ex.TargetSite);
        }
    }

エラーが発生した場所はFile.Copy(sourceDir + "\\" + toBeCopied[i] ...です。

デバイスのマッピングに関係している可能性があることを読みましたが、それが何であるかはよくわかりません。

4

5 に答える 5

5

MSDNのPath.Combineメソッドを見ていただけますか?これにより、パス全体に、本来あるべきではない場所に余分な\が含まれないようにすることができます。

すなわち Path.Combine(sourceDir, toBeCopied[i])

それでもエラーが発生する場合は、上記の場合の値をお知らせください。

于 2011-06-06T21:48:05.733 に答える
4

ファイル名までのターゲットパスは存在しますか? File.Copy()欠落している中間パスは作成されません。これは自分で行う必要があります。デバッガーを使用して、作成しているソースパスとターゲットパスの両方を確認し、ソースが存在し、ターゲットが少なくともターゲットファイルの親まで存在することを確認します。

于 2011-06-06T21:53:19.953 に答える
3

作成された場所は表示されませんtoBeCopied。クリックイベントで設定された値の終わりを超えて実行していて、空の名前のファイルの束をコピーしようとしているようです。

クリックイベントの先頭にこれを追加する必要があります

toBeCopied = new string[listView1.SelectedItems.Count];

また(他の人が指摘しているように)代わりに

sourceDir + "\\" + toBeCopied[i]

あなたが使用する必要があります

Path.Combine(sourceDir, toBeCopied[i])
于 2011-06-06T21:49:53.137 に答える
1

とが両方存在すると仮定するsourceDirtargetDir(これを確認でき確認する必要があります)、末尾のが2倍になる可能性があります\。パスを作成するときは、Path.Combineを使用する必要があります。

File.Copy(Path.Combine(sourceDir, toBeCopied[i]), Path.Combine(targetDir, toBeCopied[i]), true);
于 2011-06-06T21:47:52.797 に答える
0

ヘンクのループから借用していますが、OPに問題があるのはチェック/作成が必要なパスが見つからないエラーであるため、ファイルとディレクトリのチェックを追加します。

for (int i = 0; i < toBeCopied.Length; ++i)
{
    string sourceFile = Path.Combine(sourceDir, toBeCopied[i]);
    if(File.Exists(sourceFile))
    { 
        string targetFile = Path.Combine(targetDir, toBeCopied[i]);
        if(!Directory.Exists(targetDir)) 
            Directory.CreateDirectory(targetDir); 
        File.Copy(sourceFile, targetFile, true);
    }
    refreshToolStripMenuItem_Click(sender, e)
}
于 2011-06-07T00:27:58.583 に答える