将文件从列表框复制到另一个目录

时间:2018-04-10 08:13:47

标签: c#

我对C#很新,而我正在尝试做的是

  1. 搜索文件
  2. 将所有匹配的文件列入列表框
  3. 将文件所在的整个文件夹复制到另一个地方
  4. 我在网上找到了我正在使用的点点滴滴。现在它只是btn_search_Click部分正在运行。

    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO;
    
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btn_search_Click(object sender, EventArgs e)
            {
                try
                {
                    listBox1.Items.Clear();
                    //Directory to search in
                    DirectoryInfo Di = new DirectoryInfo(@"D:\xxxx\Versionen");
                    FileInfo[] nPfad = Di.GetFiles(textBox1.Text, SearchOption.AllDirectories);
                    Int32 nLengePfad = nPfad.GetLength(0);
                    listBox1.Items.AddRange(nPfad);
    
                }
                catch (Exception)
                {
                    MessageBox.Show("File not found");
    
                }
    
            }
            private void btn_save_Click(object sender, EventArgs e)
            {
                {
                    string sourceFile = @"D:\Users\Public\public\test.txt";
                    string destinationFile = @"D:\Users\Public\private\test.txt";
    
                    // To move a file or folder to a new location:
                    System.IO.File.Move(sourceFile, destinationFile);
    
                    // To move an entire directory. To programmatically modify or combine
                    // path strings, use the System.IO.Path class.
                    System.IO.Directory.Move(@"C:\Users\Public\public\test\", @"C:\Users\Public\private");
                }
            }
        }
    }
    

    我现在的问题是,代码是什么样的,如果我想从列表框中选择一个文件并将文件复制到其他地方而不是文件夹。我已经设置了一个btn_save和一个移动文件的基本代码,但是我需要有人向我展示一种从列表框中复制任何选定文件的方法,或者复制所选文件的文件夹。

    我对C#很新,并且对新方法持开放态度。如果我对代码完全错误,请抓一下,给我一个正确或简单的方法来实现相同的

2 个答案:

答案 0 :(得分:1)

您可以使用Directory.Move直接移动目录。

使用FileInfo.DirectoryName,您可以从FileInfo[] SelectedItems获取目录路径。

var itemsToMove = myListBox.SelectedItems.Cast<FileInfo>();
var directoriesTheyAreIn = itemsToMove.Select(x => x.DirectoryName);

var cleanDirectoriesList = directoriesTheyAreIn.Distinct();
//As many file can be in the same Dir we only need to move the dire once to move those file.

但是,如果Dir包含选定和未选择的文件,该怎么办?在这里,我将全部移动它们。

foreach (var path in cleanDirectoriesList)
{
    // here you have to craft your destination directory
    string destinationDirectory = "";
    Directory.Move(path, destinationDirectory);
}

从你的问题来看,目前尚不清楚旧路径应该保留在新路径中的哪一部分。但如果它基于您的"D:\xxxx\Versionen"字符串,则只需replace此部分使用新的根路径"NewRoot\foo\bar"

 string destinationDirectory = path.Replace(@"D:\xxxx\Versionen", @"G:\FooBAR\NEWPATH\");

如果您只需要移动所选文件,则可以在复制每个文件之前盲目地调用Directory.CreateDirectory,因为如果该目录已存在,则不会抛出错误。对目录进行分组以避免无用的指令本来是可能的,但我觉得修改起来并不容易。这里的代码只是:创建目录然后move the file

foreach (var item in itemsToMove) {
    string destinationDirectory = @"BasedPath\" + " Craft it ";
    Directory.CreateDirectory(destinationDirectory);
    File.Move(item.FullName, destinationDirectory + item.Name);
}

答案 1 :(得分:0)

将文件列表存储到List<FileInfo>并使用foreach进行迭代。这对我有用:

        string destination = @"C:\Some\Destination\";
        string actualFile = string.Empty;
        foreach (var file in fileList)
        {
            actualFile = file.FullName;
            File.Copy(actualFile, destination + Path.GetFileName(actualFile));
        }