kiler4747
Участник
Offline
|
|
« : 08-03-2011 19:06 » |
|
#pragma once #include <windows.h> #include <tchar.h> #include <stdio.h> #include <strsafe.h> #pragma comment(lib, "User32.lib") #include <winbase.h> #include <windef.h> #include <wtypes.h> WIN32_FIND_DATA win; HANDLE hfind; int n;
namespace searchfiles {
using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing;
/// <summary> /// Сводка для Form1 /// </summary> int SearchFiles(LPCTSTR lpszFileName, BOOL bInnerFolders = TRUE) { LPTSTR part; char tmp[MAX_PATH]; // временный массив char name[MAX_PATH];
HANDLE hSearch = NULL; WIN32_FIND_DATA wfd; memset(&wfd, 0, sizeof(WIN32_FIND_DATA));
if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE) return TRUE; // в противном случае выходим do if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // если мы нашли файл { char file[MAX_PATH]; if(GetFullPathName(lpszFileName, MAX_PATH, file, &part) == 0) return FALSE; strcpy(part, wfd.cFileName); n++;
} while (FindNextFile(hSearch, &wfd)); // ищем следующий файл FindClose (hSearch); // заканчиваем поиск
// сначало поиск внутри вложенных папках ... if(bInnerFolders) { if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) return FALSE; strcpy(name, part); strcpy(part, "*.*");
// если папки существуют, то делаем поиск wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE)) do { // в каждой папке есть две папки с именами "." и ".." // и эти папки мы не трогаем
// пропускаем папки "." и ".." if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2)) continue;
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если мы нашли папку { char next[MAX_PATH]; if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE; strcpy(part, wfd.cFileName); strcat(next, "\\"); strcat(next, name);
SearchFiles(next, TRUE); } } while (FindNextFile(hSearch, &wfd)); // ищем следующий файл
FindClose (hSearch); // заканчиваем поиск }
return n; } public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: добавьте код конструктора // }
protected: /// <summary> /// Освободить все используемые ресурсы. /// </summary> ~Form1() { if (components) { delete components; } }
private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::TextBox^ textBox1; private: System::Windows::Forms::TextBox^ textBox2;
protected:
private: /// <summary> /// Требуется переменная конструктора. /// </summary> System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code /// <summary> /// Обязательный метод для поддержки конструктора - не изменяйте /// содержимое данного метода при помощи редактора кода. /// </summary> void InitializeComponent(void) { this->button1 = (gcnew System::Windows::Forms::Button()); this->textBox1 = (gcnew System::Windows::Forms::TextBox()); this->textBox2 = (gcnew System::Windows::Forms::TextBox()); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(60, 61); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 0; this->button1->Text = L"button1"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // textBox1 // this->textBox1->Location = System::Drawing::Point(12, 100); this->textBox1->Name = L"textBox1"; this->textBox1->Size = System::Drawing::Size(123, 20); this->textBox1->TabIndex = 1; this->textBox1->TextChanged += gcnew System::EventHandler(this, &Form1::textBox1_TextChanged); // // textBox2 // this->textBox2->Location = System::Drawing::Point(12, 126); this->textBox2->Name = L"textBox2"; this->textBox2->Size = System::Drawing::Size(123, 20); this->textBox2->TabIndex = 1; this->textBox2->TextChanged += gcnew System::EventHandler(this, &Form1::textBox1_TextChanged); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(284, 262); this->Controls->Add(this->textBox2); this->Controls->Add(this->textBox1); this->Controls->Add(this->button1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); this->PerformLayout();
}
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { char file1[MAX_PATH]; SetCurrentDirectory(file1); this->button1->Text=Convert::ToString(SearchFiles(file1,TRUE)); } private: System::Void textBox1_TextChanged(System::Object^ sender, System::EventArgs^ e) { } }; }
незнаю как сделать, чтобы file1 получал путь из textbox
|
|
« Последнее редактирование: 09-03-2011 07:25 от Джон »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #1 : 08-03-2011 20:44 » |
|
Смешались в кучу кони, люди.
kiler4747, насколько хорошо ты знаешь, что такое .NET и managed C++ в частности, и с чем его едят? Дело в том, что сделать то, что ты хочешь, в нынешнем виде будет довольно проблематично. Как раз из-за специфики стыка между managed C++ и стандартным дубовым C++. То есть, там будет пара строчек, но это может показаться чистой магией без капли здравого смысла.
И просто чтобы было понятнее всем нам, можешь примерно сказать, для чего ты в принципе писал этот код? Самообразование, студенческая лабораторная работа, что-то ещё? Программирование для тебя профильная специальность? От ответа на этот вопрос зависит, на каком уровне тебе могут попытаться объяснить, что не так с твоим кодом.
Пока же замечу, что смысла в типе char[] в случае file1 я не вижу - String^ наверняка подошло бы лучше. Но это просто тыканье пальцем в небо, без попыток разобраться, что же ты на самом деле хотел. Если хочется всё-таки разобраться - то см. выше.
|
|
|
Записан
|
|
|
|
kiler4747
Участник
Offline
|
|
« Ответ #2 : 09-03-2011 14:17 » |
|
kiler4747, насколько хорошо ты знаешь, что такое .NET и managed C++ в частности, и с чем его едят?
Незнаю И просто чтобы было понятнее всем нам, можешь примерно сказать, для чего ты в принципе писал этот код? Самообразование, студенческая лабораторная работа, что-то ещё? Программирование для тебя профильная специальность? От ответа на этот вопрос зависит, на каком уровне тебе могут попытаться объяснить, что не так с твоим кодом.
Сам изучаю С++, раньше изучал Delphi.
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #3 : 09-03-2011 14:35 » |
|
kiler4747, имхо, лучше не начинать изучать C++ в связке с .NET.
C++ и так-то язык непростой, а его расширение от Microsoft для совместимости с .NET - и подавно. В целом, насколько мне известно, это расширение годится в основном для написания прослоек между нормальным C++ и .NET-приложениями. Разрабатывать десктопное .NET-приложения на нём я бы не стал - для такого есть, например, язык C#, для которого .NET, по сути, родной.
А в случае C++, полагаю, все оконные библиотеки непросты в использовании новичками - что MFC/ATL/WTL, что Qt, что ещё какая-нибудь: язык просто такой.
|
|
|
Записан
|
|
|
|
kiler4747
Участник
Offline
|
|
« Ответ #4 : 09-03-2011 15:15 » |
|
В интернете нашол функцию _findfirst( const char *filespec, struct _finddata_t *fileinfo ) Но незнаю как извлеч путь к файлу из fileinfo.name
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #5 : 09-03-2011 18:36 » |
|
Ну, коли нашЕл функцию, то и описание найди. Привыкай работать с документацией!
Подчеркивание в начале имени - явный признак, что это что-то нестандартно-специфическое и в отрыве от контекста не имеет смысла. Т.ч. читай доку лучше.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
kiler4747
Участник
Offline
|
|
« Ответ #6 : 09-03-2011 18:59 » |
|
char *file1; Как сделать, чтобы file1=textbox->text и наоборот
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #7 : 09-03-2011 19:00 » |
|
kiler4747, не обижайся, но ты совсем не знаешь основ - бери какой-нибудь самоучитель и работай над своими знаниями.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Вад
|
|
« Ответ #8 : 09-03-2011 21:09 » |
|
kiler4747, это не очень хорошая идея - брать функции из интернета, лишь бы их описание как-то под нужды подходило.
Ты уж определись, какими инструментами пользуешься. И потом ищи решения строго в пределах одного инструмента, а то это ведь не код будет, а сборная солянка: тут тебе и .NET, и С-шный рантайм какой-нибудь, и WinAPI, и ещё какая-нибудь штуковина.
Понимаю, что с Delphi было всё проще - там есть библиотека Борланда, и крутись вокруг неё. Язык C++ далеко не одной компанией с одним компилятором и набором библиотек развивался, так что здесь этот номер - поискать первое попавшееся - не пройдёт. Очень скоро ты обнаружишь, что у тебя в маленькую задачку понапихано десяток-другой разных библиотек, и всё это тянется за ней огромным хвостом.
|
|
|
Записан
|
|
|
|
kiler4747
Участник
Offline
|
|
« Ответ #9 : 02-04-2011 22:10 » |
|
#pragma once
namespace find_test_01 {
using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::IO;
/// <summary> /// Summary for Form1 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Add the constructor code here // }
protected: /// <summary> /// Clean up any resources being used. /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::TextBox^ textBox1; private: System::Windows::Forms::TextBox^ textBox2; private: System::Windows::Forms::TextBox^ textBox3;
private: System::Windows::Forms::Button^ button2; private: System::Windows::Forms::FolderBrowserDialog^ folderBrowserDialog1; private: System::Windows::Forms::Button^ button3;
protected:
private: /// <summary> /// Required designer variable. /// </summary> System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> void InitializeComponent(void) { this->button1 = (gcnew System::Windows::Forms::Button()); this->textBox1 = (gcnew System::Windows::Forms::TextBox()); this->textBox2 = (gcnew System::Windows::Forms::TextBox()); this->textBox3 = (gcnew System::Windows::Forms::TextBox()); this->button2 = (gcnew System::Windows::Forms::Button()); this->folderBrowserDialog1 = (gcnew System::Windows::Forms::FolderBrowserDialog()); this->button3 = (gcnew System::Windows::Forms::Button()); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(311, 62); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(201, 79); this->button1->TabIndex = 0; this->button1->Text = L"button1"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); // // textBox1 // this->textBox1->Location = System::Drawing::Point(78, 237); this->textBox1->Multiline = true; this->textBox1->Name = L"textBox1"; this->textBox1->ScrollBars = System::Windows::Forms::ScrollBars::Both; this->textBox1->Size = System::Drawing::Size(336, 92); this->textBox1->TabIndex = 1; // // textBox2 // this->textBox2->Location = System::Drawing::Point(33, 31); this->textBox2->Name = L"textBox2"; this->textBox2->Size = System::Drawing::Size(154, 22); this->textBox2->TabIndex = 2; // // textBox3 // this->textBox3->Location = System::Drawing::Point(33, 81); this->textBox3->Name = L"textBox3"; this->textBox3->Size = System::Drawing::Size(154, 22); this->textBox3->TabIndex = 2; // // button2 // this->button2->Location = System::Drawing::Point(214, 31); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(91, 32); this->button2->TabIndex = 3; this->button2->Text = L"button2"; this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click); // // button3 // this->button3->Location = System::Drawing::Point(208, 84); this->button3->Name = L"button3"; this->button3->Size = System::Drawing::Size(96, 28); this->button3->TabIndex = 4; this->button3->Text = L"button3"; this->button3->UseVisualStyleBackColor = true; this->button3->Click += gcnew System::EventHandler(this, &Form1::button3_Click); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(8, 16); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(619, 378); this->Controls->Add(this->button3); this->Controls->Add(this->button2); this->Controls->Add(this->textBox3); this->Controls->Add(this->textBox2); this->Controls->Add(this->button1); this->Controls->Add(this->textBox1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); this->PerformLayout();
} #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { DirectoryInfo^ di = gcnew DirectoryInfo( this->textBox2->Text ); String^ out = gcnew String( this->textBox3->Text + L"\\" + di->Name); long num = 0; num = find(di, out); this->button1->Text = Convert::ToString(num); } public:
long find(DirectoryInfo^ pach, String^ out) { long number = 0; array<DirectoryInfo^>^ dir = pach->GetDirectories(); for each (DirectoryInfo^ di in dir) { if ( !Directory::Exists(out +L"\\"+ di->Name)) Directory::CreateDirectory(out +L"\\"+ di->Name); number += find(di, out +L"\\"+ di->Name); } array<FileInfo^>^ files = pach->GetFiles(); for each (FileInfo^ filess in files) { this->textBox1->AppendText(filess->FullName + "\n"); if ( File::Exists(out +L"\\"+ filess->Name) ) { if ( ( File::GetLastWriteTime(out +L"\\"+ filess->Name) ) < filess->LastWriteTime ) File::Copy(filess->FullName ,out +L"\\"+ filess->Name, true); } else File::Copy(filess->FullName ,out +L"\\"+ filess->Name); number++; } return number; } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { if ( this->folderBrowserDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) this->textBox2->Text = this->folderBrowserDialog1->SelectedPath; } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { if ( this->folderBrowserDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) this->textBox3->Text = this->folderBrowserDialog1->SelectedPath; } }; }
Выдаёт ошибку когда название файла на белоруском языке
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #10 : 03-04-2011 07:26 » |
|
kiler4747, и?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
kiler4747
Участник
Offline
|
|
« Ответ #11 : 03-04-2011 08:53 » |
|
Как это исправить? Выдаёт ошибку когда начинает копировать файл Could not find a part of the path
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #12 : 03-04-2011 09:16 » |
|
kiler4747, ну очевидно не использовать имена файлов на белорусском языке
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
kiler4747
Участник
Offline
|
|
« Ответ #13 : 03-04-2011 09:32 » |
|
Как сделать чтобы когда возникает эта ошибка программа пропускала этот файл?
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #14 : 03-04-2011 11:39 » |
|
kiler4747, открыть свойства файла и пометить, что файл не должен участвовать в сборке.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Вад
|
|
« Ответ #15 : 03-04-2011 16:49 » |
|
Dimka, я думаю, здесь речь о чём-то другом.
kiler4747, вообще, странно, с юникодом не должно быть таких проблем, как какой-то конкретный язык имён файлов.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #16 : 04-04-2011 04:00 » |
|
Вад, а я думаю, когда же kiler4747 поймёт, что если он на что-то рассчитывает, то ему нужно подробно описывать свои проблемы В частности, там речь шла про копирование - не исключено, что это про Post-Build Event или что-нибудь такое. В таком случае причин может быть миллион, но до kiler4747 это не доходит.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
|