Member 8010354 Ответов: 1

Как применить порог папки при копировании файлов из одного места в другое


Привет Команда,

Ниже приведен код, написанный на BUTTON_CLICK. После нажатия на кнопку файлы из источника должны быть скопированы в пункт назначения.

В исходном коде файлы будут помещены в несколько папок, как показано ниже:

C:\\users\A\B\010\100 Файлы
C:\\users\A\B\011\100 Файлы
C:\\users\A\B\012\100 Файлы

Но в пункте назначения мне нужны файлы для копирования в соответствии с приведенной ниже структурой папок, как показано ниже:

D:\\users\Y\Z\001\25 Файлы
D:\\users\Y\Z\002\25 Файлы
D:\\users\Y\Z\003\25 Файлы

Как и в приведенном выше примере, он должен создать подпапку с именем 001 внутри пути назначения, а ограничение папки должно составлять всего 25 файлов. После копирования 25 файлов он должен скопировать остальные 25 в папку 002.

Я управлял кодом до тех пор, пока не отфильтровал конкретные расширения файлов в исходном пути и не скопировал их в конечный путь.

Не могли бы вы помочь мне с порогом папки?

Ниже приведен код, написанный в кнопке click:

private void button2_Click(object sender, EventArgs e)
        {   
            string source = textBox1.Text;
            string destination = textBox2.Text;
            var thresholdvalue = textBox3.Text;
            var extensions = new[] { ".tif", ".tiff", ".jpg", ".jpeg" };
 var files = Directory.GetFiles(source, "*.*", SearchOption.AllDirectories);//.
            //Where(S => extensions.Contains(Path.GetExtension(S).TrimStart('.').ToLowerInvariant()));
            foreach (var item in files)
            {
                if(extensions.Contains(Path.GetExtension(item)))
                {
                    File.Copy(item, destination + Path.GetFileName(item));
                }
            }
            var sizes = Directory.GetFiles(destination, "*.*", SearchOption.AllDirectories).Count();
            MessageBox.Show("All " + sizes + " files are copied");
}


Что я уже пробовал:

я пробовал добавлять подпапки, но не смог динамически создать пороговое значение.

1 Ответов

Рейтинг:
2

Richard Deeming

Попробуйте что-нибудь вроде этого:

if (!int.TryParse(textBox3.Text, out int thresholdValue) || thresholdValue < 1)
{
    // TODO: Display an error message to the user
    return;
}

string source = textBox1.Text;
string destination = textBox2.Text;

int totalFileCount = 0;
int currentSubFolder = 0;
int remainingFileCount = 0;
string destinationFolder = null;

ISet<string> extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) 
{
    ".tif", 
    ".tiff", 
    ".jpg", 
    ".jpeg" 
};

IEnumerable<string> files = Directory
    .EnumerateFiles(source, "*", SearchOption.AllDirectories)
    .Where(f => extensions.Contains(Path.GetExtension(f)));

foreach (string sourceFile in files)
{
    if (remainingFileCount == 0)
    {
        // First file, or the sub-folder is full:
        currentSubFolder++;
        destinationFolder = Path.Combine(destination, currentSubFolder.ToString("D3"));
        if (!Directory.Exists(destinationFolder)) Directory.CreateDirectory(destinationFolder);
        remainingFileCount = thresholdValue;
    }
    
    string destinationFile = Path.Combine(destinationFolder, Path.GetFileName(sourceFile));
    File.Copy(sourceFile, destinationFile);
    totalFileCount++;
    remainingFileCount--;
}

MessageBox.Show("All " + totalFileCount + " files are copied");
Теперь сделайте себе одолжение и дайте своим элементам управления осмысленные имена, вместо того чтобы принимать имена по умолчанию, предоставляемые Visual Studio. Конечно, вы можете вспомнить, что textBox42 представляет сейчас но когда вы вернетесь к своему коду через пару недель , вы все забудете.


Member 8010354

Спасибо вам, сэр, за вашу помощь в этом деле.