簡體   English   中英

將文件從列表框復制到另一個目錄

[英]Copy files from listbox to another directory

我對C#相當陌生,我想做的是

  1. 搜索文件
  2. 將所有匹配的文件列出到列表框中
  3. 將文件所在的整個文件夾復制到另一個位置

我在網絡上發現了點點滴滴。 現在只有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#相當陌生,並且願意接受新方法。 如果我對代碼完全不對,請刮掉它,然后向我展示一種實現相同目標的正確或更簡單的方法

您可以使用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"字符串,則可以簡單地新的根路徑"NewRoot\\foo\\bar" 替換此部分:

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

如果只需要移動選定的文件,則可以在復制每個文件之前盲目調用Directory.CreateDirectory ,因為如果目錄已經存在,它不會引發錯誤。 可以對目錄進行分組以避免不必要的指令,但是我覺得修改起來並不容易。 這里的代碼將簡單地是:創建目錄,然后移動文件

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

將文件列表存儲到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));
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM