C# копирование папок с сервера

using System;
using System.Collections.Generic;
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 Application2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Btn_search_Click(object sender, EventArgs e)
        {
            //Uses the text entered by user
            //searchAndCopy(txtbox1.Text);

            //Uses file for copy process
            searchAllLines(@"D:\Icyer\liste2.txt");
        }

        private void searchAllLines(string filename)
        {
            foreach (string line in File.ReadLines(filename))
            {
                searchAndCopy(line);
            }
        }

        private void searchAndCopy(string textToSearch)
        {
//            MessageBox.Show("|" + textToSearch + "|");
            string srcfolder = @"X:\xxxx\xxxx\xxxx\xxxx";
            DirectoryInfo Ordner = new DirectoryInfo(srcfolder);
            FileInfo[] Pfad = Ordner.GetFiles("*" + textToSearch + "*", SearchOption.AllDirectories);
            foreach (var item in Pfad)
            {
                string destinationDirectory = @"D:\xxxx\Copy\";
                //Directory.CreateDirectory(destinationDirectory);
                string[] substrings = item.FullName.Split('\\');
                string folder = substrings[srcfolder.Split('\\').Length - 1];

                if(folder == textToSearch) {
                    DirectoryCopy(srcfolder + folder, destinationDirectory + folder, true);
                }
                //File.Copy(item.FullName, item.Name);

            }
        }

        private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs)
        {
            DirectoryInfo dir = new DirectoryInfo(sourceDirName);
            DirectoryInfo[] dirs = dir.GetDirectories();

            // If the source directory does not exist, throw an exception.
            if (!dir.Exists)
            {
                throw new DirectoryNotFoundException(
                    "Source directory does not exist or could not be found: " + sourceDirName);
            }

            // If the destination directory does not exist, create it.
            if (!Directory.Exists(destDirName))
            {
                Directory.CreateDirectory(destDirName);
            }


            // Get the file contents of the directory to copy.
            FileInfo[] files = dir.GetFiles();

            foreach (FileInfo file in files)
            {
                // Create the path to the new copy of the file.
                string temppath = Path.Combine(destDirName, file.Name);
                try
                {
                    // Copy the file.
                    file.CopyTo(temppath, false);
                }
                catch { };
            }

            // If copySubDirs is true, copy the subdirectories.
            if (copySubDirs)
            {

                foreach (DirectoryInfo subdir in dirs)
                {
                    // Create the subdirectory.
                    string temppath = Path.Combine(destDirName, subdir.Name);

                    // Copy the subdirectories.
                    DirectoryCopy(subdir.FullName, temppath, copySubDirs);
                }
                //MessageBox.Show("Done!");
            }
        }
    }
}

Код работает отлично, когда я пытаюсь скопировать из «D: в D:», когда я пытаюсь изменить код из

string srcfolder = @"D:\xxxx\xxxx\";

к

string srcfolder = @"X:\xxxx\xxxx\xxxx\xxxx";

Приложение зависает при втором нажатии на кнопку. Может ли кто-нибудь сказать мне, нужно ли это делать, потому что я пытаюсь скопировать файлы с сервера или где-то есть ошибка в коде. Доступ к серверу предоставлен, и у меня есть права копировать файлы. Пункт назначения должен оставаться на "D:". От «X:» до «X:» тоже не работает, приложение зависает при втором нажатии кнопки.

Вы пытались отладить, где происходит зависание? Может быть, вы просто получаете очень много файлов и строку 'FileInfo [] Pfad = Ordner.GetFiles (""+ textToSearch +"", SearchOption.AllDirectories); так долго? - Как правило, рекомендуется переложить интенсивные операции из потока графического интерфейса в другой поток, чтобы графический интерфейс не устарел.

dsdel 11.04.2018 12:21

вы делаете копирование в потоке пользовательского интерфейса .. поэтому он будет зависать, пока он работает, вам нужно его разгрузить

BugFinder 11.04.2018 12:28

Я только что попробовал отладить в строке FileInfo [] Pfad = Ordner.GetFiles (""+ textToSearch +"", SearchOption.AllDirectories); он застревает, до тех пор, пока не проходит гладко, после этого перестает работать. Но есть ли объяснение, почему он отлично работает от «D:» до «D:» и перестает работать при обращении к серверу «X:». Как только я передаю строку "foreach (var item в Pfad), она останавливается (чтобы было понятнее)"

ZeouLs 11.04.2018 12:29

Хорошо, что я сделал, я сократил список файлов, которые у него были, поэтому ищите и копируйте, через минуту приложение снова отвечает, НО оно не копировало файлы, которые были в list.txt, и как я буду выполнять разгрузку, никогда не делал что раньше.

ZeouLs 11.04.2018 12:42
0
4
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как показывают ваши комментарии, в каталоге есть много файлов, и вы извлекаете все, а затем повторяете их снова в своей подфункции. Локальный диск всегда намного быстрее, чем сетевой - также, возможно, у вас есть только некоторые тестовые данные на вашем локальном диске, а не все дерево зеркально отражено.

В общем, вы должны выгрузить свою обработку в отдельный поток - таким образом вы можете вернуть «информацию о состоянии» в свой поток графического интерфейса и отобразить их (приложение больше не будет устаревшим).

С этой строкой:

 FileInfo[] Pfad = Ordner.GetFiles("*" + textToSearch + "*", SearchOption.AllDirectories);

вы извлекаете все файлы, соответствующие вашей строке textSearch, во всех подкаталогах. В зависимости от количества файлов и каталогов это может занять очень много времени.

Возможно, было бы лучше перебрать каждый каталог рекурсивно, проверяя содержимое, если что-то нужно скопировать?

Про разгрузку в другой поток можно посмотреть здесь

Можете ли вы дать мне образец кода для рекурсивной проверки?

ZeouLs 11.04.2018 13:56

Посмотрите этот статья msdn :)

dsdel 11.04.2018 14:02

Я понимаю, что за этим стоит, но из-за отсутствия моих навыков я честно не знаю, как мне нужно было бы изменить свой код, чтобы достичь этого. Его не обязательно копировать, его тоже можно переместить.

ZeouLs 11.04.2018 14:11

@ZeouLs никогда не думают о «отсутствии навыков» - думайте об этом как о «изучении чего-то нового». Например. начнем с пошагового создания функции рекурсивного копирования. Не думайте о целом, подумайте, разделите работу, которую нужно сделать, на маленькие шаги, и вы обязательно добьетесь ее :) Вначале это много чтения / обучения и отладки, понимание всего потока программы

dsdel 11.04.2018 14:22

дело в том, что мне нужно прочитать имена папок из list.txt и переместить / скопировать их куда-нибудь еще, но глядя на страницу msdn 1. они делают это с помощью консольного приложения и 2. они не используют list.txt для получить имена папок, но использовать для перемещения один файл. Мой мозг вот-вот взорвется

ZeouLs 11.04.2018 14:49

Нет никакой разницы между формами Windows или консольным приложением рядом с графическим интерфейсом пользователя :) В обоих проектах будут выполняться одни и те же методы без каких-либо различий. Также нет никакой разницы в вашей обработке - вам просто нужно вызвать новый метод из searchAndCopy (line);

dsdel 11.04.2018 15:10

На этот раз я написал новый код, пытаясь выполнить System.IO.File.Move, но я не уверен, что еще мне не хватает, так как я получаю сообщение об ошибке, что файл не может быть найден. Это потому, что я ищу не файлы, а папки? pastebin.com/GXsXVHF7

ZeouLs 11.04.2018 15:11

Да, вам нужно искать файлы в каждой папке - но только в этом каталоге, а не во всех каталогах :)

dsdel 11.04.2018 15:13

позвольте мне дать вам представление о том, что я пытаюсь сделать. У меня 200Гб файлов. Файлы начинаются с того же имени, что и папка, в которой они находятся. Мне нужны папки, включающие эти файлы, и переместите их в другое место. Так что мне нужны не только файлы, но и вся папка, в которой находится каждый файл. Для этого у меня есть list.txt, содержащий имена папок. Мне нужно импортировать список, найти имя папки и переместить или скопировать их в другое место. У меня уже есть первый опубликованный мной метод, но, как я уже сказал, он застревает и требует времени, поэтому я пытаюсь заставить его работать с System.IO.File.Move._.

ZeouLs 11.04.2018 15:21

С точки зрения скорости не будет никакой разницы при использовании File.Move или File.Copy (перемещение - это просто копирование с окончательным удалением). Если вы получите сразу все файлы - вам нужно будет дождаться завершения работы вашей операционной системы. Если вы проанализируете каждый каталог и проверите файлы внутри этого каталога, вы можете обработать копию напрямую или создать список и, наконец, скопировать их. На самом деле нет никакой разницы, просто каталог за каталогом не будет устаревать надолго, чтобы получить все файлы.

dsdel 11.04.2018 15:23

Хорошо, если я правильно вас понял, не будет никакой разницы, если я использую копирование или перемещение, но будет лучше, если я изменю способ поиска в каталоге?

ZeouLs 11.04.2018 15:25

В целом это также займет то же время, но, как было написано ранее (если вы выполняете операцию в другом файле), вы можете обновлять статус - вы можете прервать операцию и выполнить копирование непосредственно для каждого файла.

dsdel 11.04.2018 15:31

хорошо, приятель, если это не повлияет на время, я думаю, я просто запущу его как есть, я могу позволить ему поработать на выходных и так далее

ZeouLs 11.04.2018 15:39

Другие вопросы по теме