Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
NicaD
0 / 0 / 0
Регистрация: 03.01.2018
Сообщений: 45
1

Цикл выполняется один раз вместо нескольких

09.01.2018, 14:19. Просмотров 888. Ответов 8
Метки нет (Все метки)

Есть папка с 354 файлами
Нужно,чтобы стало 299
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Data::renewFiles() {
    QDir dir;
    dir.cd(QDir::currentPath() + "/result/");
    dir.setFilter(QDir::Files);
    dir.setSorting(QDir::Name | QDir::Reversed);
 
    QStringList list = dir.entryList();
    while(list.length() > 300) { //этот цикл
        QFile file_to_remove(QDir::currentPath() + "/result/" + list[0]);
 
        file_to_remove.remove();
        list = dir.entryList();
    }
}
Data::~Data() {
    renewFiles();
}
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2018, 14:19
Ответы с готовыми решениями:

Цикл выполняется один раз вместо нескольких
Есть папка из 354 файлов,нужно,чтобы осталось 299 void Data::renewFiles() { QDir dir; ...

Цикл for выполняется 1 раз вместо двух!!!
непонятно, добавил нужное условие, но цикл выполняется ТОЛЬКО 1 раз, хотя по условию должен...

Цикл выполняется один раз
Здравствуйте! Помогите, пожалуйста с задачей. Пусть а=а=1. а = а + а/2к-1 где...

Цикл выполняется только один раз
var a, b, s :integer; begin read (a); s:=0; repeat begin if (a mod 10 mod 2)<>0 then s:=s + a...

Цикл выполняется лишь один раз
Вот мой код, который за никнеймом пользователя должен создавать по простому циклу ему пароль - 1...

8
Digital_Cry
Заблокирован
09.01.2018, 14:32 2
Лучший ответ Сообщение было отмечено NicaD как решение

Решение

Цитата Сообщение от NicaD Посмотреть сообщение
Нужно,чтобы стало 299
тогда условие должно быть
C++ (Qt)
1
 while(list.length() > 299)
ну уж никак не > 300

Цикл выполняется один раз вместо нескольких
скорее всего вот это всё нужно перенести в тело цикла
C++ (Qt)
1
2
3
4
 QDir dir;
    dir.cd(QDir::currentPath() + "/result/");
    dir.setFilter(QDir::Files);
    dir.setSorting(QDir::Name | QDir::Reversed);
т.к. QDir у тебя инициализируется один раз вначале и ему невдомёк, что в файловой системе что-то изменилось. Для отслеживания изменений в файловой системе используют QFileSystemWatcher, но в данном случае он тебе не нужен
0
NicaD
0 / 0 / 0
Регистрация: 03.01.2018
Сообщений: 45
09.01.2018, 15:15  [ТС] 3
Ах да,я ошиблась.Надо оставить 300 файлов,но вам огромное спасибо.спасли меня)
0
terriblemike
49 / 42 / 15
Регистрация: 16.06.2015
Сообщений: 182
10.01.2018, 08:50 4
Цитата Сообщение от Digital_Cry Посмотреть сообщение
скорее всего вот это всё нужно перенести в тело цикла
Не совсем правильный подход, т.к. каждый раз будет опрашиваться директория на количество файлов. В то время как достаточно получить перечень файлов один раз, а потом в цикле после удаления файла удалять имя файла из list вместо того, чтобы
Цитата Сообщение от NicaD Посмотреть сообщение
list = dir.entryList();
0
alexu_007
236 / 244 / 47
Регистрация: 29.05.2015
Сообщений: 1,527
10.01.2018, 09:36 5
Ника, есть в программировании такая вещь, называется отладка. Т.е. редко какая программа сразу начинает работать правильно, если уж не совсем примитивная, типо ХеллоВорд. Тем более у вас, связано с чтением/удалением файлов - слэши не в ту сторону поставили (или может двойные ставить нужно было) - вот и не читается ничего. Хотя вообще странно, что выполняется один раз - логичнее было бы ни одного раза или бесконечно.

Итак отладка. Я бы это сделал так:

1. Вставить в хедер #include <QMessageBox>
2. Объявляем сообщение QMessageBox msgBox;
3. В нужном месте выводим сообщение на экран

C++ (Qt)
1
2
    msgBox.setText("Hello World");
    msgBox.exec();
При этом программа останавливается, выводит в окошке интересующую нас инфу - и программа не продолжается, пока кнопку Ок не нажать.

Применительно к вашей программе, я бы сделал так:

1.


C++ (Qt)
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
void Data::renewFiles() {
    QDir dir;
    dir.cd(QDir::currentPath() + "/result/");
    dir.setFilter(QDir::Files);
    dir.setSorting(QDir::Name | QDir::Reversed);
 
QMessageBox msgBox;
 
    QStringList list = dir.entryList();
 
//увидите, сколько записей поместилось в список
msgBox.setText(QString::number(list.length());
msgBox.exec();
 
    while(list.length() > 300) { //этот цикл
        QFile file_to_remove(QDir::currentPath() + "/result/" + list[0]);
 
        file_to_remove.remove();
        list = dir.entryList();
 
 
//увидите, сколько записей осталось в списке
//если вообще в цикл заходит, т.е. изначально файлов было больше 300
//и должно при каждом проходе уменьшаться на 1
msgBox.setText(QString::number(list.length());
msgBox.exec();
    }
}
Data::~Data() {
    renewFiles();
}
Хотя правильнее конечно не получать каждый раз новый список файлов, а уменьшать имеющийся, удаляя одну запись спереди (наверняка QStringList имеет такой метод) при удалении файла. Либо подсчитать заранее на сколько файлов нужно уменьшить список, и удалять файлы из list[0] - list[n]
0
Digital_Cry
Заблокирован
10.01.2018, 12:48 6
Цитата Сообщение от terriblemike Посмотреть сообщение
В то время как достаточно получить перечень файлов один раз, а потом в цикле после удаления файла удалять имя файла из list вместо того, чтобы
А вдруг во время выполнения цикла другой процесс создаст там файл?
0
alexu_007
236 / 244 / 47
Регистрация: 29.05.2015
Сообщений: 1,527
10.01.2018, 13:34 7
Это от задачи зависит, существует ли такой процесс, который именно по этому адресу свои файлы вставлять будет? Ну и сама задача "оставить 300 файлов, удалив первые" попахивает маразматичной. Или неудачной учебной - нафига столько файлов создавать, засорять файловую систему?
0
terriblemike
49 / 42 / 15
Регистрация: 16.06.2015
Сообщений: 182
11.01.2018, 09:57 8
Цитата Сообщение от Digital_Cry Посмотреть сообщение
А вдруг во время выполнения цикла другой процесс создаст там файл?
в этом случае по окончанию удаления можно добавить проверку на количество оставшихся файлов в папке.
Просто мое решение будет выполняться быстрее, т.к. получение списка каждый раз после удаления это не быстрый процесс. А если там миллион мелких файлов. Гораздо быстрее сначала удалить, а по окончанию на всякий пожарный проверить количество.
Делал аналогичную задачу по ограничению размера папки логов. Там просто использовал фильтр по дате создания файлов и удалял сначала старые логи.
0
Digital_Cry
Заблокирован
11.01.2018, 09:59 9
задача изначально бредовая, тут нечего обсуждать
0
11.01.2018, 09:59
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2018, 09:59

Цикл выполняется только один раз.
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; using namespace std; struct kvartira { int...

Почему этот цикл выполняется один раз?
Canvas, прорисовав один раз все изображения, останавливается, а задача в том чтобы изображения...

Цикл выполняется один раз из трех нужных
$x = 20; do { $howmuchhave = db_select('groups_lords', 'v') -&gt;fields('v', array('howmuch'))...


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

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

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