| 
			| 
					
						| 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  это не доходит. |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	|  |