Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [C++] Помогите с поиском файлов  (Прочитано 15014 раз)
0 Пользователей и 1 Гость смотрят эту тему.
kiler4747
Участник

by
Offline Offline

« : 08-03-2011 19:06 » 

Код: (C++)
#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 от Джон » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 08-03-2011 20:44 » 

Смешались в кучу кони, люди.

kiler4747, насколько хорошо ты знаешь, что такое .NET и managed C++ в частности, и с чем его едят?
Дело в том, что сделать то, что ты хочешь, в нынешнем виде будет довольно проблематично. Как раз из-за специфики стыка между managed C++ и стандартным дубовым C++. То есть, там будет пара строчек, но это может показаться чистой магией без капли здравого смысла.

И просто чтобы было понятнее всем нам, можешь примерно сказать, для чего ты в принципе писал этот код? Самообразование, студенческая лабораторная работа, что-то ещё? Программирование для тебя профильная специальность? От ответа на этот вопрос зависит, на каком уровне тебе могут попытаться объяснить, что не так с твоим кодом.

Пока же замечу, что смысла в типе char[] в случае file1 я не вижу - String^ наверняка подошло бы лучше. Но это просто тыканье пальцем в небо, без попыток разобраться, что же ты на самом деле хотел. Если хочется всё-таки разобраться - то см. выше.
Записан
kiler4747
Участник

by
Offline Offline

« Ответ #2 : 09-03-2011 14:17 » 


kiler4747, насколько хорошо ты знаешь, что такое .NET и managed C++ в частности, и с чем его едят?
Незнаю

И просто чтобы было понятнее всем нам, можешь примерно сказать, для чего ты в принципе писал этот код? Самообразование, студенческая лабораторная работа, что-то ещё? Программирование для тебя профильная специальность? От ответа на этот вопрос зависит, на каком уровне тебе могут попытаться объяснить, что не так с твоим кодом.
Сам изучаю С++, раньше изучал Delphi.
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 09-03-2011 14:35 » 

kiler4747, имхо, лучше не начинать изучать C++ в связке с .NET.

C++ и так-то язык непростой, а его расширение от Microsoft для совместимости с .NET - и подавно. В целом, насколько мне известно, это расширение годится в основном для написания прослоек между нормальным C++ и .NET-приложениями. Разрабатывать десктопное .NET-приложения на нём я бы не стал - для такого есть, например, язык C#, для которого .NET, по сути, родной.

А в случае C++, полагаю, все оконные библиотеки непросты в использовании новичками - что MFC/ATL/WTL, что Qt, что ещё какая-нибудь: язык просто такой.
Записан
kiler4747
Участник

by
Offline Offline

« Ответ #4 : 09-03-2011 15:15 » 

В интернете нашол функцию
_findfirst(
   const char *filespec,
   struct _finddata_t *fileinfo
)
Но незнаю как извлеч путь к файлу из fileinfo.name
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 09-03-2011 18:36 » 

Ну, коли нашЕл функцию, то и описание найди. Привыкай работать с документацией!

Подчеркивание в начале имени - явный признак, что это что-то нестандартно-специфическое и в отрыве от контекста не имеет смысла. Т.ч. читай доку лучше.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
kiler4747
Участник

by
Offline Offline

« Ответ #6 : 09-03-2011 18:59 » 

char *file1;
Как сделать, чтобы file1=textbox->text и наоборот
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 09-03-2011 19:00 » 

kiler4747, не обижайся, но ты совсем не знаешь основ - бери какой-нибудь самоучитель и работай над своими знаниями.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 09-03-2011 21:09 » 

kiler4747, это не очень хорошая идея - брать функции из интернета, лишь бы их описание как-то под нужды подходило.

Ты уж определись, какими инструментами пользуешься. И потом ищи решения строго в пределах одного инструмента, а то это ведь не код будет, а сборная солянка: тут тебе и .NET, и С-шный рантайм какой-нибудь, и WinAPI, и ещё какая-нибудь штуковина.

Понимаю, что с Delphi было всё проще - там есть библиотека Борланда, и крутись вокруг неё. Язык C++ далеко не одной компанией с одним компилятором и набором библиотек развивался, так что здесь этот номер - поискать первое попавшееся - не пройдёт. Очень скоро ты обнаружишь, что у тебя в маленькую задачку понапихано десяток-другой разных библиотек, и всё это тянется за ней огромным хвостом.
Записан
kiler4747
Участник

by
Offline 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 03-04-2011 07:26 » 

kiler4747, и?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
kiler4747
Участник

by
Offline Offline

« Ответ #11 : 03-04-2011 08:53 » 

Как это исправить? Выдаёт ошибку когда начинает копировать файл Could not find a part of the path
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 03-04-2011 09:16 » 

kiler4747, ну очевидно не использовать имена файлов на белорусском языке Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
kiler4747
Участник

by
Offline Offline

« Ответ #13 : 03-04-2011 09:32 » 

Как сделать чтобы когда возникает эта ошибка программа пропускала этот файл?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 03-04-2011 11:39 » 

kiler4747, открыть свойства файла и пометить, что файл не должен участвовать в сборке.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 03-04-2011 16:49 » 

Dimka, я думаю, здесь речь о чём-то другом.

kiler4747, вообще, странно, с юникодом не должно быть таких проблем, как какой-то конкретный язык имён файлов.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 04-04-2011 04:00 » 

Вад, а я думаю, когда же kiler4747 поймёт, что если он на что-то рассчитывает, то ему нужно подробно описывать свои проблемы Улыбаюсь

В частности, там речь шла про копирование - не исключено, что это про Post-Build Event или что-нибудь такое. В таком случае причин может быть миллион, но до kiler4747 это не доходит.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines