Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
Infinity3000
1060 / 579 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
1

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

04.10.2011, 12:31. Просмотров 2746. Ответов 27
Метки нет (Все метки)

Здравствуйте.

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

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

Исполняемый файл программы (*.ехе) мы кидаем в любую папку, после запуска (*.ехе) в текстовый файл (*.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;
}

Спасибо!!!)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2011, 12:31
Ответы с готовыми решениями:

Переписать все числа из файлов 1.txt и 2.txt в файл 3.txt
Здравствуйте! Нужна помощь. Есть два текстовых файла 1.txt и 2.txt в них...

Записать 200 случайных чисел в файл a.txt. В файл b.txt вывести четные, а в файл c.txt нечетные
Записать 200 случайных чисел в файл a.txt. В файл b.txt вывести четные, а в...

Запись в файл txt
studBeg = GetStud(hDlg); out.open("output.txt", ios_base::app); ...

Запись в файл .txt . C++
Здравствуйте! Планировал записывать при каждом вызове функции в текст с новой...

Чтение/запись из/в файл .txt
Имеется файл названный stses формата txt, и вот его содержание: 3 Loyed 4...

27
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 12:37 2
Используя WinAPI?
1
Infinity3000
1060 / 579 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 12:37  [ТС] 3
Цитата Сообщение от Deviaphan Посмотреть сообщение
Используя WinAPI?
а точнее))))
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 12:43 4
Написать перебор файлов в папках и подпапках используя WinAPI?
1
Infinity3000
1060 / 579 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 12:43  [ТС] 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 програмкиЁ
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 12:44 6
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
1
Infinity3000
1060 / 579 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 12:44  [ТС] 7
Цитата Сообщение от Deviaphan Посмотреть сообщение
Написать перебор файлов в папках

Каким образом??
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 12:46 8
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Каким образом??
Это я не намекал на способ решения, а спрашивал, для Windows программа или нет.
Знаки препинания я по назначению использую, а не только для смайликов.
1
Infinity3000
1060 / 579 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 12:51  [ТС] 9
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это я не намекал на способ решения, а спрашивал, для Windows программа или нет.
Знаки препинания я по назначению использую, а не только для смайликов.
Обыкновенная консольная программка!!
Запускаешь, консоль появилась - изщезла, и потом создался *.txt с путями!
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 12:57 10
По ссылке выше обыкновенная консольная программа, которая делает почти то, что тебе нужно. Читай, разбирайся, твори.
1
-=ЮрА=-
Заблокирован
Автор FAQ
04.10.2011, 13:01 11
Infinity3000, посмотри сюда
Поиск файла по шаблону
там лишь немножко под себя доработать останется...
1
Infinity3000
1060 / 579 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 13:02  [ТС] 12
Цитата Сообщение от Deviaphan Посмотреть сообщение
По ссылке выше обыкновенная консольная программа, которая делает почти то, что тебе нужно. Читай, разбирайся, твори.
Да. Но она ищет путь к *.ехе файлу. А мне нужно чтобы находило пути к файлам которые лежат в одной директиве с *.ехе. Плюс если есть папки в этой директории то и пути к тем файлом которые лежат в папках.)
0
Infinity3000
1060 / 579 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 13:03  [ТС] 13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Infinity3000, посмотри сюда
Поиск файла по шаблону
там лишь немножко под себя доработать останется...
спасибо!!!
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.10.2011, 13:04 14
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Читай, разбирайся, твори
Почитай про флаги, которые для результатов доступны и т.д. В общем, подпись свою перечитай.
1
xAtom
918 / 743 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
04.10.2011, 20:29 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;
}
Вот ещё исходник.
1
Вложения
Тип файла: rar flist.rar (4.2 Кб, 18 просмотров)
Infinity3000
1060 / 579 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
04.10.2011, 22:18  [ТС] 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 минуты
И что вариантов нет?? у меня уже сил нет!)
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
05.10.2011, 06:12 17
Повнимательнее посмотри пример, который тебе Юра дал. Там есть проверка того, что найдена НЕ папка. Догадаешся, как сделать рекурсивный вызов?
1
-=ЮрА=-
Заблокирован
Автор FAQ
05.10.2011, 09:32 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
0
Миниатюры
Запись путей файлов в *.txt файл.  
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
05.10.2011, 09:37 19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Режил сделать по заданию
Чтобы было "по заданию", добавь рекурсивный вызов для папок. Файлы из подпапок тоже выводить надо.
1
-=ЮрА=-
Заблокирован
Автор FAQ
05.10.2011, 10:49 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
1
05.10.2011, 10:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2011, 10:49

Запись текста в файл txt
Здравствуйте , подскажите как реализовать запись в файл, у меня что то не...

Запись данных в файл txt
записываю через for(int i=0;i&lt;l;i++) f&lt;&lt;a.fio&lt;&lt;&quot; &quot;&lt;&lt;a.nomer&lt;&lt;&quot;...

Зависает запись в txt - файл
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #include &lt;conio.h&gt;...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru