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

Странное поведение функций _findfirst() и _findnext() - C++

Восстановить пароль Регистрация
 
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
14.02.2013, 15:29     Странное поведение функций _findfirst() и _findnext() #1
в материалах по С++ дан пример работы с файлами, переименование, удаление и просмотр содержимого директории.
Просмотр осуществляется с помощью структуры fileinfo и функций _findfirst() и _findnext(). Вопрос следующий, в каждой папке у меня оказывается по 2 дополнительных файла с именем точка и две точки, почему?

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <stdio.h>
#include <io.h>       
#include <string.h>
#include <iostream>
using namespace std;
#include <windows.h>
void RenameFile();
void RemoveFile();   
void Dir();    
void main()
{
    // предлагаем выбрать пункт меню для выполнения
    cout << "Please, select preffer number...\n";
    //выбор пользователя
    char ch; 
    do{
        // Переименовать
        cout << "\n1 - Rename\n";
        // Удалить   
        cout << "2 - Remove\n";   
        // Просмотреть некоторую папку(каталог)
        cout << "3 - View some folder\n";   
        // Выход
        cout << "0 - Exit\n\n";    
        cin >> ch;
 
        // анализируем и вызываем 
        // соответствующую  функцию
        switch(ch)
        {
            case '1':
                RenameFile();   
            break;
            case '2':
                RemoveFile();   
            break;
            case '3':
                Dir();
            break;
        }           
    } while(ch != '0');      // Выход из программы
}
// Переименовать существующий файл
void RenameFile()       
{
    char oldName[50], newName[50];
    // В одной переменной запомним существующее имя (oldName), 
    cout << "Enter old name:";
    cin >> oldName;
    // А в другой новое имя(newName)
    cout << "Enter new name:";
    cin >> newName;
    // Произведем переименование и проверку результата
    if (rename(oldName, newName) != 0)
        cout << "Error!\n Couldn't rename file. Check old and new filename...\n\n";
    else 
        cout << "Ok...\n\n";
}
// Удалить существующий файл
void RemoveFile()           
{
    char Name[50];
    // Получаем имя и путь к удаляемому файлу
    cout << "Enter name:";
    cin >> Name;
 
    //Удаляем файл и проверяем результат    
    if (remove(Name) != 0)
        cout << "Error!\n Couldn't remove file. Check filename...\n";
    else 
        cout << "Ok...\n" ;
}
// Поиск файлов в каталоге
void Dir()                        
{
    // Запросим ПУТЬ (например, папка Temp на диске C, запишется 
    // таким вот образом: c:\temp\)
    char path[70];
    cout << "\nEnter full path (for example, C:\\):";
    cin >> path;
    // Запросим маску файлов 
    char mask[15];
    cout << "\nEnter mask (for example, *.* or *.txt):";
    cin >> mask;
    // Соединив две строки, мы получим результат
    // т.е. что хочет найти пользователь и где
    strcat(path, mask);
    // Объявление указателя fileinfo на структуру _finddata_t
    // и создание динамического объекта структуры _finddata_t
    _finddata_t *fileinfo=new _finddata_t;  
    // Начинаем поиск
    long done = _findfirst(path,fileinfo);
    // если done будет равняться -1, 
    // то поиск вести бесмысленно
    int MayWeWork = done;   
    // Счетчик, содержит информацию о количестве найденых файлов.   
    int count = 0;   
    while (MayWeWork!=-1)
    {   
        count++;
        // перекодировали имя найденного файла
        // на случай, если оно кириллическое
        AnsiToOem(fileinfo->name,fileinfo->name);
        // Распечатали имя найденного файла
        cout << fileinfo->name << "\n\n"; 
        // Пытаемся найти следующий файл из группы
        MayWeWork = _findnext(done, fileinfo);        
    }
    // Вывод сообщения о количестве найденных файлов.
    cout << "\nInformation: was found " << count;
    cout << " file(s) in folder..." << path << "\n\n";
    // Очистка памяти
    _findclose(done);
    delete fileinfo;
}
Миниатюры
Странное поведение функций _findfirst() и _findnext()  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2013, 15:29     Странное поведение функций _findfirst() и _findnext()
Посмотрите здесь:

C++ Странное поведение транслятора
C++ Странное поведение
Странное поведение wstring C++
странное поведение указателя C++
Странное поведение new C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,581
Записей в блоге: 17
14.02.2013, 15:48     Странное поведение функций _findfirst() и _findnext() #2
. - текущий каталог
.. - каталог выше на уровень от текущего ( родительский по отношению к текущему )
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
14.02.2013, 15:55  [ТС]     Странное поведение функций _findfirst() и _findnext() #3
Это нормальная работа этих функций? Это значит что текущий каталог существует, что существует так же каталог на порядок выше, и в работе это при отстутсвии необходимости надо игнорировать?
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,581
Записей в блоге: 17
14.02.2013, 15:57     Странное поведение функций _findfirst() и _findnext() #4
Ну не знаю насколько это нормально, обычно эти точки просто выкидывают при переборе файлов ( имеется ввиду в коде предусматривоют)

И если у вас установлен boost то я бы использовал boost/filesystem - он как по мне удобнее...
Байт
 Аватар для Байт
13961 / 8792 / 1223
Регистрация: 24.12.2010
Сообщений: 15,925
14.02.2013, 16:25     Странное поведение функций _findfirst() и _findnext() #5
Цитата Сообщение от Alexxx7 Посмотреть сообщение
2 дополнительных файла с именем точка и две точки, почему?
Как только создается папка (некорневая) тут же операционка создает в ней 2 папки "." и ".." Так что это происходит автоматом и сэтим поделать ничего нельзя (да и не надо). А при переборе просто их пропускай и все дела.
VadimuSSS
 Аватар для VadimuSSS
2 / 2 / 0
Регистрация: 23.06.2014
Сообщений: 147
10.02.2016, 03:18     Странное поведение функций _findfirst() и _findnext() #6
Байт,
C++
1
2
3
4
if (fileinfo->name != "." && fileinfo->name != "..")
            {
                //тут код для других папок. не для "." и ".."
            }
таким образом пропустить их не удается...как же тогда?
cyber-satyr
Заблокирован
10.02.2016, 04:18     Странное поведение функций _findfirst() и _findnext() #7
ну если учесть особенность современных систем windows, в которых явно запрещено называть файлы с точки, то достаточно будет проверять только первый символ.

Добавлено через 53 секунды
Для пользователей unix подобных систем в "этих странных точках" нет ничего ни нового, ни удивительного.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2016, 05:27     Странное поведение функций _findfirst() и _findnext()
Еще ссылки по теме:

Странное поведение cin C++
Странное поведение функции C++
Странное поведение указателя C++

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

Или воспользуйтесь поиском по форуму:
nd2
1030 / 769 / 258
Регистрация: 29.01.2016
Сообщений: 2,400
10.02.2016, 05:27     Странное поведение функций _findfirst() и _findnext() #8
Цитата Сообщение от VadimuSSS Посмотреть сообщение
как же тогда?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//...
    int count = 0;   
    while (MayWeWork!=-1)
    {   
        
        // перекодировали имя найденного файла
        // на случай, если оно кириллическое
        AnsiToOem(fileinfo->name,fileinfo->name);
        // Распечатали имя найденного файла
        if (strcmp(fileinfo->name,  ".") != 0 && strcmp(fileinfo->name,  "..") != 0)
        {
            count++;
            cout << fileinfo->name << "\n\n";
        }
        // Пытаемся найти следующий файл из группы
        MayWeWork = _findnext(done, fileinfo);        
    }
//...
Yandex
Объявления
10.02.2016, 05:27     Странное поведение функций _findfirst() и _findnext()
Ответ Создать тему
Опции темы

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