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

#c# #file-copying #create-directory

Вопрос:

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

Текущий код:

 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;
using Microsoft.VisualBasic;

namespace ME_Nitra_BIW_App
{
    public partial class ToolingDesign : Form
    {

        // create folder path to enable new folder creation
        private void btnGenerateFilePath_Click(object sender, EventArgs e)
        {
            folderBrowserDialog1.ShowDialog();
            tBoxFilePath.Text = folderBrowserDialog1.SelectedPath;
            btnCreateDir.Enabled = true;
        }

        private void btnCreateDir_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(tBoxFilePath.Text))
            {
                System.Windows.Forms.MessageBox.Show("No file path selected!");
            }
            else
            {

                // for Assembly folder
                string fileNameAssy = "FIXED_PARTS_PRODUCT.CATProduct";
                string sourcePathAssy = @"c:UsersmjanusDownloadsCATIAV5START_MODELSCAT_PRODUCTS";
                string targetPathAssy = tBoxFilePath.Text   @""   tBoxFolderName.Text   @""   tBoxFolderName.Text   "_U000"   "_ASSEMBLY";
                

                // use path class to manipulate file and directory paths
                string sourceFile = System.IO.Path.Combine(sourcePathAssy, fileNameAssy);
                string destFile = System.IO.Path.Combine(targetPathAssy, fileNameAssy);
                string dirPath = tBoxFilePath.Text   @""   tBoxFolderName.Text   @""   tBoxFolderName.Text;

                // create new folders with generated names
                btnGenerateFilePath.Enabled = false;
                btnCreateDir.Enabled = false;
                Directory.CreateDirectory(tBoxFilePath.Text   @""   tBoxFolderName.Text);
                System.Threading.Thread.Sleep(500);
                Directory.CreateDirectory(dirPath   "_U000"   "_ASSEMBLY");
                Directory.CreateDirectory(dirPath   "_U001"   "_PRODUCT_PARTS");
                Directory.CreateDirectory(dirPath   "_U002"   "_CLAMP_STUDY");
                Directory.CreateDirectory(dirPath   "_U003"   "_GUN_STUDY");
                Directory.CreateDirectory(dirPath   "_U004"   "_PRODUCT_PARTS");
                Directory.CreateDirectory(dirPath   "_U005"   "_MECHANICAL_SEQUENCES");
                Directory.CreateDirectory(dirPath   "_U006"   "_MISCELLANEOUS");
                Directory.CreateDirectory(dirPath   "_U007"   "_SUPPORT");

                // ask if user wants to copy template files to the newly created folders
                DialogResult dialogResult = MessageBox.Show("Directories successfuly created!"   Environment.NewLine   "Do you wish to copy files now?", "Success!", MessageBoxButtons.YesNo);
                if (dialogResult == DialogResult.Yes)
                {
                    // if the directory folder already exists, this method does not create a new directory
                    System.IO.Directory.CreateDirectory(targetPathAssy);
                    // overwrite the destination file if it already exists
                    System.IO.File.Copy(sourceFile, destFile, true);
                    // start of copy
                    if (System.IO.Directory.Exists(sourcePathAssy))
                    {
                        string[] files = System.IO.Directory.GetFiles(sourcePathAssy);

                        foreach (string s in files)
                        {
                            fileNameAssy = System.IO.Path.GetFileName(s);
                            destFile = System.IO.Path.Combine(targetPathAssy, fileNameAssy);
                            System.IO.File.Copy(s, destFile, true);
                        }
                    }
                    else
                    {
                        MessageBox.Show("Source path does not exist!");
                    }
                }
                else if (dialogResult == DialogResult.No)
                {
                    this.Close();
                }
            }
        }
}
 

Как вы можете видеть, я установил targetPathAssy в то же место, в котором создается новая папка, но я не уверен, что код может это прочитать? Или как я мог бы сохранить этот недавно созданный путь к каталогу и вызвать его?

Комментарии:

1. Используйте Path.Combine для построения путей, а не для объединения строк.. И, пожалуйста, в интересах создания действительно читаемого кода переименуйте элементы управления после того, как вы поместите их в форму. Код, полный текстового Поля6, кнопки 23, метки 19, фактически является запутанным мусором.. У вас есть роскошь вернуться в конструктор и проверить, является ли имя textBox34 или textBox38, но мы этого не делаем.. И только подумайте, вам даже не пришлось бы возвращаться в конструктор, если бы он назывался firstNameTextBox

2. » Я не уверен, что код может это прочитать?» Вы это тестировали? Вы проверили значение переменной с помощью отладчика? В чем на самом деле проблема? Или это просто внутреннее чутье?

3. У меня есть проблемы с пониманием вашего вопроса. Вы устанавливаете для переменной targetPathAssy определенное значение. То же значение, которое вы используете для создания каталога несколькими строками ниже. А позже вы попытаетесь снова создать тот же каталог, на этот раз с помощью переменной targetPathAssy . Я не уверен, что это та проблема, на которую вы ссылаетесь в своем вопросе, но на данный момент код, похоже, не имеет смысла.

4. Я подумал, что могу повторно использовать тот же путь к каталогу, поэтому спросил, может ли это сработать или нет, в основном после создания новых каталогов я хочу скопировать определенные файлы в эти новые каталоги, которые я получаю » Система. Несанкционированное исключение accessexception’ произошло в mscorlib.dll, Дополнительная информация: Доступ к пути ‘C:UsersmjanusDesktopTestL462_BR02_010_011_COM_TRL462_BR02_010_011_COM_TR_U000_ASSEMBLYFIXED_PARTS_PRODUCT.CATProduct-в этом отказано.

5. Допустим, вы создаете базовый путь, чтобы упростить вещи и сделать их более удобочитаемыми: var templatePath = tBoxFilePath.Text @"" tBoxFolderName.Text @"" ; . Затем используйте templatePath вместо tBoxFilePath.Text @"" tBoxFolderName.Text в своем коде. Кроме того, я заметил, что вы используете его слишком много раз, например tBoxFilePath.Text @"" tBoxFolderName.Text @"" tBoxFolderName.Text "_U000" "_ASSEMBLY" : разве это не должно быть похоже templatePath fileNameAssy на то, как если бы вы объявили var fileNameAssy = ... ранее ? Делает код более понятным и менее подверженным ошибкам.

Ответ №1:

Я нашел решение, и оно намного проще, чем то, что я пробовал раньше.

Вот полный код:

 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;
using Microsoft.VisualBasic;

namespace ME_Nitra_BIW_App
{
    public partial class ToolingDesign : Form
    {
        public ToolingDesign()
        {
            InitializeComponent();
            radioButton1.CheckedChanged  = new EventHandler(radioButton_CheckedChanged);
            radioButton2.CheckedChanged  = new EventHandler(radioButton_CheckedChanged);   
        }
private void btnCreateDir_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(tBoxFilePath.Text))
            {
                System.Windows.Forms.MessageBox.Show("No file path selected!");
            }
            else
            {
                // directory path
                string dirPath = tBoxFilePath.Text   @""   tBoxFolderName.Text   @""   tBoxFolderName.Text;   
                
                // where to paste the files
                string targetPathAssy = dirPath   "_U000"   "_ASSEMBLY";

                // create new folders with generated names
                btnGenerateFilePath.Enabled = false;
                btnCreateDir.Enabled = false;
                Directory.CreateDirectory(tBoxFilePath.Text   @""   tBoxFolderName.Text);
                System.Threading.Thread.Sleep(500);
                Directory.CreateDirectory(dirPath   "_U000"   "_ASSEMBLY");
                Directory.CreateDirectory(dirPath   "_U001"   "_PRODUCT_PARTS");
                Directory.CreateDirectory(dirPath   "_U002"   "_CLAMP_STUDY");
                Directory.CreateDirectory(dirPath   "_U003"   "_GUN_STUDY");
                Directory.CreateDirectory(dirPath   "_U004"   "_PRODUCT_PARTS");
                Directory.CreateDirectory(dirPath   "_U005"   "_MECHANICAL_SEQUENCES");
                Directory.CreateDirectory(dirPath   "_U006"   "_MISCELLANEOUS");
                Directory.CreateDirectory(dirPath   "_U007"   "_SUPPORT");

                // ask if user wants to copy template files to the newly created folders
                DialogResult dialogResult = MessageBox.Show("Directories successfuly created!"   Environment.NewLine   "Do you wish to copy files now?", "Success!", MessageBoxButtons.YesNo);
                if (dialogResult == DialogResult.Yes)
                {
                    // test copy

                    File.Copy(@"ResourcesUNIT_START_PRODUCT.CATProduct", targetPathAssy   @""   "UNIT_START_PRODUCT.CATProduct");
                    
                }
                else if (dialogResult == DialogResult.No)
                {
                    this.Close();
                }
            }
        }

        // create folder path to enable new folder creation
        private void btnGenerateFilePath_Click(object sender, EventArgs e)
        {
            folderBrowserDialog1.ShowDialog();
            tBoxFilePath.Text = folderBrowserDialog1.SelectedPath;
            btnCreateDir.Enabled = true;
        }

    }
}
 

Изменение:

Оказывается, я могу использовать ту же строку для копирования файла во вновь созданный каталог, в котором используется строка dirPath , как показано выше. Хотя я встроил файлы в приложение (простота использования, не уверен, что получу выделенную папку на сервере) Я использовал

 File.Copy(@"ResourcesUNIT_START_PRODUCT.CATProduct", targetPathAssy   @""   "UNIT_START_PRODUCT.CATProduct");
 

Мне пришлось добавить @"" , потому что в противном случае скопированный файл был бы targetPathAssy добавлен в его имя, а не в конкретную папку.

Надеюсь, это поможет кому-то в будущем