Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2013, 10:40   #1
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию Не работает код определения размера директории

Суть метода проста,в рекурсии суммируем размеры всех файлов внутри папки - это и есть размер. Но выдает 0 всегда:
Код:
// Определение размера папки
int GetFolderSize(String^ PapkaPath)
{
  DWORDLONG Result=0;
  WIN32_FIND_DATA findfiledata;
  using namespace System::Runtime::InteropServices;
  MessageBox::Show(PapkaPath+Convert::ToString(Result));
  IntPtr sysfolder=System::Runtime::InteropServices::Marshal::StringToHGlobalAuto(PapkaPath+"\\*.*");
 LPCWSTR papkaname=(LPCWSTR)sysfolder.ToPointer();
  HANDLE hFind=FindFirstFile(papkaname,&findfiledata);
  Marshal::FreeHGlobal(sysfolder);
  if (hFind!=INVALID_HANDLE_VALUE)
  {
	  do
  {
	  String^ origstr=gcnew String(findfiledata.cFileName);
	  if((origstr!=".")&&(origstr!=".."))
		  if(findfiledata.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
			  Result=Result+GetFolderSize(PapkaPath+"\\"+origstr);
		  else
			  Result=Result+((DWORDLONG)findfiledata.nFileSizeHigh<<32)+findfiledata.nFileSizeLow;
  }
  while (FindNextFile(hFind,&findfiledata));
  }
 else MessageBox::Show("Определить размер папки "+PapkaPath+" не удалось.Может быть,она пустая или к ней нет доступа");
  FindClose(hFind);
  CloseHandle(hFind);
 return Result;
}
calypso вне форума Ответить с цитированием
Старый 28.11.2013, 11:36   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Отладчик не помог?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.11.2013, 13:39   #3
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Не работает переход между внутренними подкаталогами. Ну например:
C:\Folder\Folder1
C:\Folder\Folder2
Заходит в Folder1,правильно определяет размер внутренних файлов, затем вместо Folder2 прыгает в C:\Folder и пишет что к ней нет доступа
calypso вне форума Ответить с цитированием
Старый 28.11.2013, 15:10   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Х.з... Без отладки детально не разобраться.
Цитата:
IntPtr sysfolder=System::Runtime::InteropS ervices::Marshal::StringToHGlobalAu to(PapkaPath+"\\*.*");
LPCWSTR papkaname=(LPCWSTR)sysfolder.ToPoin ter();
А это чисто для получения указтеля на строку пути?
Может в таких плюшках залуп? Я вот сколько работал с CLR всегда старался использовать это:
Код:
void TLoader::url(System::String^ aurl){
				_url=new char[aurl->Length+1];
				{
					int i=0;
					for(i=0;i<aurl->Length;i++) _url[i]=aurl[i];
					_url[i]=0;
				}
Это из одного моего примера перевод строки в массив символов.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.11.2013, 20:54   #5
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Не,маршаллинг работает - там ничего сложного нет,я не знаю почему все так боятся этих InteropServices,указателей,грязного CLR кода и т.д.
Проблема судя по всему в логике алгоритма.Упрощенный код:
Код:
если origstr!="." или origstr!=".." то:
если нашли директорию то:
Result=Result+GetFolderSize(каталог ниже уровнем+"\\"+origstr)
иначе Result=Result+размер текущего файла
calypso вне форума Ответить с цитированием
Старый 29.11.2013, 00:15   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тогда только отладка. На глаз не видно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.11.2013, 01:57   #7
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Ну я имею ввиду что в целом алгоритм правильный? Потому что это из Борланда был пример,для Visual C++ готового примера для определения размера каталога я не нашел. Более того,удивительно что мелкософт не сделали готовую API GetFolderSize, чтобы программисты не изголялись с рекурсиями
calypso вне форума Ответить с цитированием
Старый 29.11.2013, 11:16   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Что-то переменная Result одного типа а функция возвращает другой тип...
waleri вне форума Ответить с цитированием
Старый 02.12.2013, 11:08   #9
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Проблема была здесь:
CloseHandle(hFind);
Эта строка вызывает исключение. Без нее всё работает,правда новый косяк - Result при больших размерах папки выдает отрицательное значение.
Уже было такое,не помню как лечилось. LONGDWORD, __int64 тоже самое
calypso вне форума Ответить с цитированием
Старый 02.12.2013, 11:47   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Эта строка вызывает исключение.
Исключение??? О_о
WINAPIшная функция вызывает исключение???
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция для определения размера матрицы Aztek93 Общие вопросы C/C++ 7 12.06.2012 18:42
[Pascal] Исправить код определения, лежит ли точка внутри данного прямоугольника 777pro777 Помощь студентам 5 27.02.2012 13:34
Не работает код определения всех компов в сети doniyor Работа с сетью в Delphi 2 20.01.2010 12:18
Функция определения размера проекции файла. nazavrik Общие вопросы C/C++ 0 17.10.2009 19:08