Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / работа с директориями / 19 сообщений из 19, страница 1 из 1
18.01.2013, 19:30
    #38115928
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
Добрый вечер,
Подскажите пожалуйста, как сделать так,чтобы выбиралась директория та, которую назначу сам, а не по дефолту?
Код:
Код: plaintext
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.
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <iostream>
using namespace std;
 
int main (void)
{
    setlocale (LC_ALL, "RUSSIAN");
    //Размер директории
    long int sizedir = 0;
    //Вспомогательные структуры и дескрипторы
    struct _finddata_t file;
    intptr_t hFile;
 
    //Открываем текущую директорию
    if ((hFile = _findfirst ( "*.*", &file )) == -1L)
    {
        cerr << "Не удалось открыть директорию" << endl;
    }
    else
    {
        //В цикле обходим файлы директории
        do
        {
            cout << file.name << " = " << file.size << " bytes " << endl;
            sizedir += file.size;
        }
        while ( _findnext (hFile, &file) == 0 );
        //Закрываем директорию
        _findclose (hFile);
        cout << "Общий размер директории = " << sizedir << " bytes " << endl;
    }
    //Остановка перед закрытием окна
    system ("PAUSE");
    return 0;
}


нужно переделать скорей всего кусок
Код: plaintext
1.
 if ((hFile = _findfirst ( "*.*", &file )) == -1L)


но не могу понять как?
...
Рейтинг: 0 / 0
18.01.2013, 20:25
    #38115981
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
Если используешь _findfirst, то _chdir спасет.
...
Рейтинг: 0 / 0
20.01.2013, 20:42
    #38117056
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
White Owl,

спасибо
...
Рейтинг: 0 / 0
20.01.2013, 20:52
    #38117064
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
пошел по другому пути
Код: plaintext
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.
void FolderSize(AnsiString Folder,int &Size,int &fCount,int &folCount)
  {
  // Функция записывает в параметры:
  // Size - размер папки в байтах
  //fCount - общее количество файлов в папке
  //folCount - общее количество подпапок в папке

  TSearchRec SR;
  // Проверяем, заканчивается ли путь к папке на \,
  // если да, то удаляем его
  if(Folder[Folder.Length()] == '\\')
	 Folder.SetLength(Folder.Length()-1);
  // Делаем первый поиск
  if(FindFirst(Folder+"\\*.*",faAnyFile,SR) == 0)
   do
	  {   //Если то что мы нашли не является обратными ссылками...
		 if(SR.Name != "." &&  SR.Name != "..")
		 {
			// Если то что мы нашли является папкой,
			// функция вызывает саму себя
			// и увеличивает счетчик кол-ва подпапок
			if((SR.Attr & faDirectory)!=0)
               {
				  FolderSize(Folder+"\\"+SR.Name,Size,fCount,folCount);
				  folCount++;
			   }
			else
               {
                  // Если это файл - прибавляем его размер к общему размеру
				  Size = Size + SR.Size;
				  fCount++;
               }
		 }
	  }
   while(FindNext(SR)==0);
	FindClose(SR);
  }



использую так:
Код: plaintext
1.
2.
3.
4.
5.
int a =0 , b = 0, c = 0; // Не забываем обнулить переменные.
  FolderSize("E:\\delphi",a,b,c); // Вообще здесь результат выбора папки DirectoryListBox
  ShowMessage (a); // Размер папки в байтах.
  ShowMessage (b); // Общее количество файлов в папке.
  ShowMessage (c); // Общее количество подпапок.



Проблемы:
1) не работает с размером папки больше >4Гб
2) Реализую с помошью C++ Builder, создан пользовательский интерфейс,в котором папки выбираю с помощью TDirectoryListBox, т.е. при выборе папки возвращает мне E:\delphi, а мне нужно чтобы было E:\\delphi, предварительно помещаю значение в Edit,после этого отрабатывает функции.
Как здесь поступить? парсить Edit, и после \ вставлять ещё один \.
Может быть можно оптимизировать саму функцию,чтобы она работала с одинарными \ ???
только не знаю как?
...
Рейтинг: 0 / 0
20.01.2013, 21:05
    #38117071
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
denis_stellа мне нужно чтобы было E:\\delphi
1) Используй 64-х разрядный аккумулятор
2) Зачем? Это синтаксис исключительно для литералов. Функция работает с одним бэкслэшем.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.01.2013, 22:51
    #38117133
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
Dimitry Sibiryakov,
Что-то я "погяричился", второй вопрос отпал....
но с 1)
так и не разобрался,можно по конкретней?или пример?
...
Рейтинг: 0 / 0
20.01.2013, 22:53
    #38117136
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
Dimitry Sibiryakov,

Может на первый взгляд глупые вопросы задаю, но если не затруднит, подскажите,что вы имели ввиду под
"Используй 64-х разрядный аккумулятор"
...
Рейтинг: 0 / 0
20.01.2013, 23:05
    #38117150
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
Dimitry Sibiryakov,

смотрю структуру TSearchRec, размер _int64
struct TSearchRec
{

public:
int Time;
__int64 Size;
int Attr;
TFileName Name;
int ExcludeAttr;
unsigned FindHandle;
_WIN32_FIND_DATAW FindData;
};


разве в данном случае не должно отрабатывать всё корректно?
А у меня в результате, если большая папка то результат отрицательный
...
Рейтинг: 0 / 0
20.01.2013, 23:08
    #38117154
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
denis_stellА у меня в результате, если большая папка то результат отрицательный

Потом что у тебя переменная Size объявлена как int.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.01.2013, 23:40
    #38117181
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
Dimitry Sibiryakov,

точно,спасибо.
double справился с задачей
...
Рейтинг: 0 / 0
21.01.2013, 00:00
    #38117197
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
denis_stelldouble справился с задачей
С дуба рухнул?.. Открой справку по целым типам, там ждёт тебя сюрприз.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.01.2013, 00:12
    #38117206
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
Dimitry Sibiryakov,

Всё,спасибо.
Разобрался
...
Рейтинг: 0 / 0
21.01.2013, 00:12
    #38117207
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
denis_stellDimitry Sibiryakov,

точно,спасибо.
double справился с задачей
А в каком контексте ты применил double и как?
...
Рейтинг: 0 / 0
21.01.2013, 10:34
    #38117463
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
mayton,

void FolderSize(AnsiString Folder,double &Size,int &fCount,int &folCount)


и
применил

int b = 0, c = 0; // Не забываем обнулить переменные.
double a=0;
//-------
...
Рейтинг: 0 / 0
21.01.2013, 10:43
    #38117479
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
Везде где есть расчёт размера файлов и директорий используй __int64.
Double тебе не поможет. Он - источник других проблем.
...
Рейтинг: 0 / 0
21.01.2013, 12:08
    #38117712
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
mayton,
спасибо,буду иметь ввиду.
А можно ещё один вопрос?
нужно
определить средний размер для каждой группы файлов (группировать по расширению и отдельной строкой - для всех) - рекурсивно по всей папке.

С какого конца как говориться взяться?если можно алгоритм или примерчик
...
Рейтинг: 0 / 0
21.01.2013, 13:00
    #38117867
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
denis_stellС какого конца как говориться взяться?если можно алгоритм или примерчик
Никакого алгоритма и примерчика. Это настолько тривиально что даже
термин алгоритм здесь неуместен. Почитай про hash_map.
...
Рейтинг: 0 / 0
21.01.2013, 14:29
    #38118066
denis_stell
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
mayton,
примерно правильно понимаю?
std::hash_map, где ключами будут строки с расширением файла, а значениями - размер?
...
Рейтинг: 0 / 0
21.01.2013, 14:59
    #38118109
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с директориями
Да.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / работа с директориями / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]