Форум программистов, компьютерный форум CyberForum.ru

Запись путей файлов в *.txt файл. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.60
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 12:31     Запись путей файлов в *.txt файл. #1
Здравствуйте.

Возник вопросик.

С помощью чего можно организовать такое действие программы!

Исполняемый файл программы (*.ехе) мы кидаем в любую папку, после запуска (*.ехе) в текстовый файл (*.txt) должны быть сохранены все пути к файлам в данной папке.

Если в папке где лежит (*.ехе) существуют еще папки и в них другие файлы то путь к ним тоже должен быть занесен в *.txt.

Например:

*.ехе помещен в папку setup

в *.txt должно быть сохранено:

C++
1
2
3
4
5
6
7
8
9
d:\setup\Half_Life_Setup.exe
d:\setup\PES2012\icon.ico
d:\setup\PES2012\setup.exe
d:\setup\PES2012\setup-1.dat
d:\setup\PES2012\setup-2.dat
d:\setup\PES2012\setup-3.dat
d:\setup\PES2012\setup-4.dat
d:\setup\PES2012\redist\vcredist_x86.exe 
d:\setup\PES2012\redist\directX\dxwebsetup.exe
Как видите сохранены все пути к файлам данной папки даже если в ней есть и другие папки с другими файлами.

В какую сторону копать??
Какие алгоритмы рассматривать??

*.txt файл создаю так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "fstream"
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    ofstream out;
 
    out.open("test.txt");//открываем / создаем test.txt
 
 
 
    out.close(); //закрываем test.txt
    return 0;
}

Спасибо!!!)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 12:37     Запись путей файлов в *.txt файл. #2
Используя WinAPI?
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 12:37  [ТС]     Запись путей файлов в *.txt файл. #3
Цитата Сообщение от Deviaphan Посмотреть сообщение
Используя WinAPI?
а точнее))))
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 12:43     Запись путей файлов в *.txt файл. #4
Написать перебор файлов в папках и подпапках используя WinAPI?
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 12:43  [ТС]     Запись путей файлов в *.txt файл. #5
Можно даже без корневого каталога!

C++
1
2
3
4
5
6
7
8
9
setup\Half_Life_Setup.exe
setup\PES2012\icon.ico
setup\PES2012\setup.exe
setup\PES2012\setup-1.dat
setup\PES2012\setup-2.dat
setup\PES2012\setup-3.dat
setup\PES2012\setup-4.dat
setup\PES2012\redist\vcredist_x86.exe 
setup\PES2012\redist\directX\dxwebsetup.exe
Начиная просматривать все пути с той папки где находить exe програмкиЁ
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 12:44     Запись путей файлов в *.txt файл. #6
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 12:44  [ТС]     Запись путей файлов в *.txt файл. #7
Цитата Сообщение от Deviaphan Посмотреть сообщение
Написать перебор файлов в папках

Каким образом??
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 12:46     Запись путей файлов в *.txt файл. #8
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Каким образом??
Это я не намекал на способ решения, а спрашивал, для Windows программа или нет.
Знаки препинания я по назначению использую, а не только для смайликов.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 12:51  [ТС]     Запись путей файлов в *.txt файл. #9
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это я не намекал на способ решения, а спрашивал, для Windows программа или нет.
Знаки препинания я по назначению использую, а не только для смайликов.
Обыкновенная консольная программка!!
Запускаешь, консоль появилась - изщезла, и потом создался *.txt с путями!
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 12:57     Запись путей файлов в *.txt файл. #10
По ссылке выше обыкновенная консольная программа, которая делает почти то, что тебе нужно. Читай, разбирайся, твори.
-=ЮрА=-
Заблокирован
Автор FAQ
04.10.2011, 13:01     Запись путей файлов в *.txt файл. #11
Infinity3000, посмотри сюда
Поиск файла по шаблону
там лишь немножко под себя доработать останется...
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 13:02  [ТС]     Запись путей файлов в *.txt файл. #12
Цитата Сообщение от Deviaphan Посмотреть сообщение
По ссылке выше обыкновенная консольная программа, которая делает почти то, что тебе нужно. Читай, разбирайся, твори.
Да. Но она ищет путь к *.ехе файлу. А мне нужно чтобы находило пути к файлам которые лежат в одной директиве с *.ехе. Плюс если есть папки в этой директории то и пути к тем файлом которые лежат в папках.)
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 13:03  [ТС]     Запись путей файлов в *.txt файл. #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Infinity3000, посмотри сюда
Поиск файла по шаблону
там лишь немножко под себя доработать останется...
спасибо!!!
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 13:04     Запись путей файлов в *.txt файл. #14
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Читай, разбирайся, твори
Почитай про флаги, которые для результатов доступны и т.д. В общем, подпись свою перечитай.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
04.10.2011, 20:29     Запись путей файлов в *.txt файл. #15
Infinity3000, вот посмотри написал на скорую руку.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <windows.h>
#include <stdio.h>
int    getInfoPath(char* name, char* path);
int    putFileName(FILE* fp, const char* name, const char* path, bool cur = true);
 
int main(){
   FILE*  fp;
   char path[MAX_PATH];
   char name[MAX_PATH];
   if(! getInfoPath(name, path)) 
        return 1;
   if(!(fp = fopen("file_list.txt", "w")))
        fp = freopen("file_list.txt", "w+", fp);
   putFileName(fp, name, path);
   fflush(fp);
   fclose(fp);
   return 0;
}
 
// берём путь из коммандой строки
int  getInfoPath(char* name, char* path) {
   char* cmd = GetCommandLineA();
   while(*cmd++ != '"'); 
   char* str;
   if(! (str = strrchr(cmd, '\\')))
         return 0;
   strncpy(path, cmd, strlen(cmd) - strlen(str) + 1);
   strcpy(name, path);
   strcat(path, "*");
   strncat(name, str + 1, strlen(str)-3);
   return 1;
}
 
// рекурсивная функция проходит по всем вложенным папкам...
int   putFileName(FILE* fp, const char* name, const char* path, bool cur) {
  WIN32_FIND_DATAA fdata;
  char dir[MAX_PATH];
  char idir[MAX_PATH];
  ZeroMemory(&fdata, sizeof(WIN32_FIND_DATAA));
  HANDLE fcur = FindFirstFileA(path, &fdata);
  if(fcur == INVALID_HANDLE_VALUE)
         return 0;
  do {
         if( ! strcmp(fdata.cFileName, ".")  || ! strcmp(fdata.cFileName, ".."))
                continue;
         strncpy(dir, path, strlen(path)-1);
         dir[strlen(path)-1] = '\0';
         if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
                 sprintf(idir, "%s%s\\*", dir, fdata.cFileName);
                 putFileName(fp, name, idir, false);
                 continue;
          } 
           if(cur) { // свой исполнительный файл не берём в отсчёт
                   sprintf(idir, "%s%s", dir, fdata.cFileName); 
                   if(! stricmp(idir, name))
                          continue;
            }
            fprintf(fp, "%s%s\n", dir, fdata.cFileName);
            printf("%s%s\n", dir, fdata.cFileName);
  } while(FindNextFileA(fcur, &fdata) != 0);
  FindClose(fcur);
  return 1;
}
Вот ещё исходник.
Вложения
Тип файла: rar flist.rar (4.2 Кб, 17 просмотров)
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 22:18  [ТС]     Запись путей файлов в *.txt файл. #16
Цитата Сообщение от xAtom Посмотреть сообщение
Infinity3000, вот посмотри написал на скорую руку.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <windows.h>
#include <stdio.h>
int    getInfoPath(char* name, char* path);
int    putFileName(FILE* fp, const char* name, const char* path, bool cur = true);
 
int main(){
   FILE*  fp;
   char path[MAX_PATH];
   char name[MAX_PATH];
   if(! getInfoPath(name, path)) 
        return 1;
   if(!(fp = fopen("file_list.txt", "w")))
        fp = freopen("file_list.txt", "w+", fp);
   putFileName(fp, name, path);
   fflush(fp);
   fclose(fp);
   return 0;
}
 
// берём путь из коммандой строки
int  getInfoPath(char* name, char* path) {
   char* cmd = GetCommandLineA();
   while(*cmd++ != '"'); 
   char* str;
   if(! (str = strrchr(cmd, '\\')))
         return 0;
   strncpy(path, cmd, strlen(cmd) - strlen(str) + 1);
   strcpy(name, path);
   strcat(path, "*");
   strncat(name, str + 1, strlen(str)-3);
   return 1;
}
 
// рекурсивная функция проходит по всем вложенным папкам...
int   putFileName(FILE* fp, const char* name, const char* path, bool cur) {
  WIN32_FIND_DATAA fdata;
  char dir[MAX_PATH];
  char idir[MAX_PATH];
  ZeroMemory(&fdata, sizeof(WIN32_FIND_DATAA));
  HANDLE fcur = FindFirstFileA(path, &fdata);
  if(fcur == INVALID_HANDLE_VALUE)
         return 0;
  do {
         if( ! strcmp(fdata.cFileName, ".")  || ! strcmp(fdata.cFileName, ".."))
                continue;
         strncpy(dir, path, strlen(path)-1);
         dir[strlen(path)-1] = '\0';
         if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
                 sprintf(idir, "%s%s\\*", dir, fdata.cFileName);
                 putFileName(fp, name, idir, false);
                 continue;
          } 
           if(cur) { // свой исполнительный файл не берём в отсчёт
                   sprintf(idir, "%s%s", dir, fdata.cFileName); 
                   if(! stricmp(idir, name))
                          continue;
            }
            fprintf(fp, "%s%s\n", dir, fdata.cFileName);
            printf("%s%s\n", dir, fdata.cFileName);
  } while(FindNextFileA(fcur, &fdata) != 0);
  FindClose(fcur);
  return 1;
}
Вот ещё исходник.

Спасибо за старания!!

все компилится, качал и сам исходник, но txt файл создается пустым, в нем нет путей к файлам!

Добавлено через 26 минут
Извиняюсь, работает, но не так ка надо!!! она работает только в тех случаях если в папке остались только файлы с любым форматом!!

Но а если в папке в которой находить это программка присутствует другая папка, тогда не работает!!

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

Добавлено через 1 час 4 минуты
И что вариантов нет?? у меня уже сил нет!)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
05.10.2011, 06:12     Запись путей файлов в *.txt файл. #17
Повнимательнее посмотри пример, который тебе Юра дал. Там есть проверка того, что найдена НЕ папка. Догадаешся, как сделать рекурсивный вызов?
-=ЮрА=-
Заблокирован
Автор FAQ
05.10.2011, 09:32     Запись путей файлов в *.txt файл. #18
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Исполняемый файл программы (*.ехе) мы кидаем в любую папку, после запуска (*.ехе) в текстовый файл (*.txt) должны быть сохранены все пути к файлам в данной папке.
Если в папке где лежит (*.ехе) существуют еще папки и в них другие файлы то путь к ним тоже должен быть занесен в *.txt.
Режил сделать по заданию, результаты поиска сохраняютя в tree.txt
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <windows.h>
#include <stdio.h>
//sPath каталог для поиска
//f - поток файла вігрузки результатов
//bSaveDirs TRUE/FALSE (печатать в файл также названия папок/или нет)
long GetFileList(const char * sPath, FILE * f, BOOL bSaveDirs);
 
int main()
{
    char sPath[MAX_PATH];
    //совсем не обяхательно использовать argv[]
    //получаем текущий каталог приложения след функцией
    GetCurrentDirectory(MAX_PATH,sPath);
    FILE * f = fopen("tree.txt","wb+");
    if(!f)
        printf("Error creation tree.txt\r\n");
    else
    {
        printf("Path to scan : %s\r\n",sPath);
        printf("Found %u FileNames\r\n",GetFileList(sPath, f, FALSE));
        fclose(f);
    }
    system("pause");
    return 0;
}
 
long GetFileList(const char * sPath, FILE * f, BOOL bSaveDirs)
{
    long nFiles = 0;
    WIN32_FIND_DATA pDATA;
    strcat(strcpy(pDATA.cFileName,sPath),"\\*.*");
    HANDLE hFile = FindFirstFile(pDATA.cFileName,&pDATA);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        do
        {
            //Пропускаем Путь\. и Путь\..
            if(strcmp(pDATA.cFileName,".")  == 0 ||
               strcmp(pDATA.cFileName,"..") == 0)
               continue;
            else
            {
                //Встретили не папку (передаём её полный путь в поток f)
                if(pDATA.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
                    fprintf(f,"%s\\%s\r\n",sPath,pDATA.cFileName);
                else//При bSaveDirs == TRUE 
                    //в файл запишем и названия папок
                    //это как опция програмы;)
                {
                    if(bSaveDirs)
                    fprintf(f,"%s\\%s\r\n",sPath,pDATA.cFileName);
                }
                nFiles++;//Это так чтобы видеть было ли что то в каталоге или нет
            }
        }
        while(FindNextFile(hFile,&pDATA));
    }
    return nFiles;
}
tree.txt
D:\МОИ ДОКУМЕНТЫ\ЮРА\ЛИЧНОЕ\PROJECTS\FILESEnum\FILESEnum.cpp
D:\МОИ ДОКУМЕНТЫ\ЮРА\ЛИЧНОЕ\PROJECTS\FILESEnum\FILESEnum.dsp
D:\МОИ ДОКУМЕНТЫ\ЮРА\ЛИЧНОЕ\PROJECTS\FILESEnum\FILESEnum.dsw
D:\МОИ ДОКУМЕНТЫ\ЮРА\ЛИЧНОЕ\PROJECTS\FILESEnum\FILESEnum.ncb
D:\МОИ ДОКУМЕНТЫ\ЮРА\ЛИЧНОЕ\PROJECTS\FILESEnum\FILESEnum.plg
D:\МОИ ДОКУМЕНТЫ\ЮРА\ЛИЧНОЕ\PROJECTS\FILESEnum\tree.txt
Миниатюры
Запись путей файлов в *.txt файл.  
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
05.10.2011, 09:37     Запись путей файлов в *.txt файл. #19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Режил сделать по заданию
Чтобы было "по заданию", добавь рекурсивный вызов для папок. Файлы из подпапок тоже выводить надо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2011, 10:49     Запись путей файлов в *.txt файл.
Еще ссылки по теме:

Запись данных в файл txt C++
Как записывать в txt-файл определенные строки из xml-файлов? C++
Разделить файл txt на несколько равных маленьких файлов C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
05.10.2011, 10:49     Запись путей файлов в *.txt файл. #20
Цитата Сообщение от Deviaphan Посмотреть сообщение
Чтобы было "по заданию", добавь рекурсивный вызов для папок. Файлы из подпапок тоже выводить надо.
- логичное замечание, с учётом этого
long GetFileList(const char * sPath, FILE * f, BOOL bSaveDirs) примет вид ниже
GetFileList с рекурсией
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
long GetFileList(const char * sPath, FILE * f, BOOL bSaveDirs)
{
    long nFiles = 0;
    char sDIR[MAX_PATH];
    WIN32_FIND_DATA pDATA;
    strcat(strcpy(pDATA.cFileName,sPath),"\\*.*");
    HANDLE hFile = FindFirstFile(pDATA.cFileName,&pDATA);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        do
        {
            //Пропускаем Путь\. и Путь\..
            if(strcmp(pDATA.cFileName,".")  == 0 ||
               strcmp(pDATA.cFileName,"..") == 0)
               continue;
            else
            {
                //Встретили не папку (передаём её полный путь в поток f)
                if(pDATA.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
                    fprintf(f,"%s\\%s\r\n",sPath,pDATA.cFileName);
                else//При bSaveDirs == TRUE 
                    //в файл запишем и названия папок
                    //это как опция програмы;)
                {
                    sprintf(sDIR,"%s\\%s",sPath,pDATA.cFileName);
                    if(bSaveDirs)
                        fprintf(f,"%s\\%s\r\n",sPath,pDATA.cFileName);
                    GetFileList(sDIR, f, bSaveDirs);
                }
                nFiles++;//Это так чтобы видеть было ли что то в каталоге или нет
            }
        }
        while(FindNextFile(hFile,&pDATA));
    }
    return nFiles;
}


Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(bSaveDirs)
* * * * * * * * * * * * * * * * * * * * * * * * fprintf(f,"%s\\%s\r\n",sPath,pDATA.cFileName);
* * * * * * * * * * * * * * * * * * * * GetFileList(sDIR, f, bSaveDirs);
- рекурсивный вызов

Добавлено через 2 минуты
Результат работы для папки программы
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\Debug\FILESEnum.exe
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\Debug\FILESEnum.ilk
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\Debug\FILESEnum.obj
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\Debug\FILESEnum.pch
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\Debug\FILESEnum.pdb
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\Debug\tree.txt
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\Debug\vc60.idb
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\Debug\vc60.pdb
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\FILESEnum.cpp
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\FILESEnum.dsp
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\FILESEnum.dsw
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\FILESEnum.exe
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\FILESEnum.ncb
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\FILESEnum.opt
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\FILESEnum.plg
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\Release\FILESEnum.exe
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\Release\FILESEnum.obj
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\Release\FILESEnum.pch
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\Release\vc60.idb
D:\Мои документы\ЮрА\Личное\PROJECTS\FILESEnum\tree.txt
Yandex
Объявления
05.10.2011, 10:49     Запись путей файлов в *.txt файл.
Ответ Создать тему
Опции темы

Текущее время: 01:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru