#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, но мы этого не делаем.. И только подумайте, вам даже не пришлось бы возвращаться в конструктор, если бы он назывался firstNameTextBox2. » Я не уверен, что код может это прочитать?» Вы это тестировали? Вы проверили значение переменной с помощью отладчика? В чем на самом деле проблема? Или это просто внутреннее чутье?
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
добавлен в его имя, а не в конкретную папку.
Надеюсь, это поможет кому-то в будущем