Listowanie plików z bieżącego katalogu i inne (C, Windows)

0

Witam,

Chciałbym napisać program w języku C pod systemem Windows, który zapisze do tablicy typu struct dane nazwa oraz wielkość plików o podanym przeze mnie rozszerzeniu, znajdujących się w bieżącym katalogu programu.
Wyglądałoby to mniej więcej tak:

  1. Deklaruje int licznik = 0;
  2. Listuje bieżący katalog, sprawdzając rozszerzenie, jeśli pasuje to licznik++;
  3. Znając ilość plików otwieram nowy blok (wiem, że można callocować ale dla opisania sytuacji wygodniejszy jest obecny sposób) i deklaruje tablice typu struct o nazwie Tab z polami nazwa i wielkość.
  4. Tworze drugi licznik np. int saved = 0, który będzie pamiętał ilość plików który zostały zapsiane do tablicy.
  5. Listuje katalog jeszcze raz. W momencie gdy napotkam plik o żądanym rozszerzeniu to zapisuje jego nazwę (wraz z rozszerzeniem oczywiście) do tablicy. Kolejno sprawdzam jego wielkość i zapisuje ją do tablicy (najlepiej w bitach). saved++;
  6. Jeśli saved == licznik, to kończę cala pętle, inaczej przechodzę do następnego elementu z listy i analogicznie krok 5.

Niby wszystko ładnie etc., ale jeśli ktoś wie to proszę o pomoc w nastepujących sprawach:

  1. Jak wylistować katalog w C?
  2. Jak w momencie listowania sprawdzać rozszerzenie?
  3. Jak znaleźć wielkość pliku w bitach?
  4. Jak przejść do następnego elementu, wylistowanych plików?

Z góry dziękuje za odpowiedzi.

Btw. trochę pisałem w C ale jakoś pól roku temu, w momencie gdy się nie ćwiczy to się zapomina.
Ale myślę, że nie musicie wszystkiego wyjaśniać mocno szczegółowo. Powinienem sobie poradzić xD

0

dirent.h
sys/stat.h

W zupełności wystarczy.

0

Niestety ta metoda jest trochę za długa. Zmieniłem koncepcje i napisałem programik w C++

#include <iostream.h>
#include <stdlib.h>
#include <dirent.h>

main() {
	int licznik = -2;
	int rozmiar;
	DIR* katalog = opendir( "Files" );
	cout << "Nazwa\t\t\tRozmiar w bitach\n";
	struct dirent* pozycja = 0;
	while (pozycja = readdir(katalog)) {
		licznik++;
		// Tutaj chcialbym sprawdzac rozmiar pliku o nazwie "(*pozycja).d_name"
		cout << (*pozycja).d_name << "\t\t\t Wypisywanie rozmiaru pliku \n"; 
	}
	closedir(katalog);
	cout << "\nIlosc plikow w katalogu: " << licznik << "\n";
	system("pause");
	exit (1);
}

Ma ktos do tego pomysl? Jak najprosztą metodą nie musi byc koniecznie bardzo szybka. Pliki jakie ma obslugiwac beda mialy max 3GB

0

do sprawdzania wielkości plików możesz spróbować użyć funkcji
ftell()
ze standardowej biblioteki stdio.h

przykład użycia (z pamięci! może zawierać błędy!)

FILE *plik;
long size;
plik=fopen("plik.xyz", "rb");
fseek(plik, 0, SEEK_END);
size = ftell(plik);

mam nadzieję, że się przyda ;) powodzenia

[edit]
nie wiem tylko, jak ta funkcja będzie reagowała na pliki, które zajmują kilka GB.
Acha, no i funkcja ta zwraca wielkość pliku w bajtach! [browar]

0

@s4ros: dzięki, powinno pomoc. Dopiero wieczorkiem do tego usiądę jak znajdę czas. Zamienię tylko int size na long int, zależy mi na wielkości w bajtach ;) Jak program będzie działał to z ciekawości przetestuje do ilu MB jest w stanie podać wielkość pliku.

Thx jeszcze raz

0

w sumie to masz słuszność ;) mea culpa..
w nagłówku funkcji ftell() jest tak:

long ftell(FILE *stream);

także w domyśle powinien być

long
0

napisałem ładnie wszystko, działa. Jest problem kolejny nie obsługuje nawet 700MB plików, mi niestety potrzeba do 3GB, więc chcialem skorzystac z funkcji GetFileSizeEx, jednak nie wiem jak załadowac biblioteke kernel32.dll do programu. na razie to wyglada tak:

#include <iostream.h>
#include <stdio.h>
#include <dirent.h>
#include <windows.h>

main() {
	int licznik = -2;
	DIR* katalog = opendir( "Files" );
	cout << "Nazwa\t\t\tRozmiar w bajtach\n";
	struct dirent* pozycja = 0;
	while (pozycja = readdir(katalog)) {
		licznik++;
		if (licznik > 0){
			FILE *plik;
			char str1[] = "Files/";
			strcat(str1, (*pozycja).d_name);
			long int size = 0;
			plik=fopen(str1, "rb");
			GetFileSizeEx(plik,&size);
			cout << (*pozycja).d_name << "\t\t\t" << size << "\n"; 
		}
	}
	closedir(katalog);
	printf("\nIlosc plikow w katalogu: %d\n", licznik);
	system("pause");
}

Przy kompilacji oczywiście błąd :P
Ktoś wie jak załadować kernel32.dll ?

0

http://msdn.microsoft.com/en-us/library/aa364957%28VS.85%29.aspx

tam piszą żeby dodać:
#include<WinBase.h>

oraz:

BOOL WINAPI GetFileSizeEx(
  __in   HANDLE hFile,
  __out  PLARGE_INTEGER lpFileSize
);
hFile [in]

    A handle to the file. The handle must have been created with either the GENERIC_READ or GENERIC_WRITE access right. For more information, see File Security and Access Rights.
lpFileSize [out]
`A pointer to a LARGE_INTEGER structure that receives the file size, in bytes.`

czytam dalej:

typedef union _LARGE_INTEGER {
  struct {
    DWORD LowPart;
    LONG HighPart;
  } ;
  struct {
    DWORD LowPart;
    LONG HighPart;
  } u;
  LONGLONG QuadPart;
}LARGE_INTEGER, *PLARGE_INTEGER;

1 użytkowników online, w tym zalogowanych: 0, gości: 1