Do pliku przez API

Biblioteka VCL dostępna w środowisku C++Builder zawiera jedynie podstawowy zestaw funkcji do obsługi plików i folderów. Zaawansowane operacje trzeba wykonywać za pomocą Windows API.

Biblioteka VCL dostępna w środowisku C++Builder zawiera jedynie podstawowy zestaw funkcji do obsługi plików i folderów. Zaawansowane operacje trzeba wykonywać za pomocą Windows API.

Podczas programowania aplikacji często zachodzi potrzeba zapisywania informacji do pliku lub odczytywania określonych ustawień komputera. Opanowanie komunikacji z plikami w systemie Windows znacznie usprawni naszą pracę.

Pobieranie informacji o dysku

Windows API dostarcza bardzo użytecznej funkcji GetVolumeInformation(), która umożliwia uzyskanie od systemu informacji na temat naszego dysku. Przykładowe wykorzystanie funkcji wygląda następująco:

void __fastcall TForm1::PobierzInformacje(void)

{

char NazwaDysku[255]="";

char SystemPlikow[255]="";

DWORD dwTemp;

DWORD NumerSeryjny;

if (GetVolumeInformation("c:\\", NazwaDysku

sizeof(NazwaDysku), &NumerSeryjny, &dwTemp

&dwTemp, SystemPlikow, sizeof(SystemPlikow)))

{

Label1->Caption =

"Numer seryjny:" + IntToStr(NumerSeryjny);

Label2->Caption =

"Nazwa dysku:" + String(NazwaDysku);

Label3->Caption =

"System plików:" + String(SystemPlikow);

}

}

Po umieszczeniu w naszym programie trzech etykiet tekstowych nazwanych odpowiednio Label1, Label2, Label3 oraz przycisku wywołującego funkcję PobierzInformacje() uzyskamy prosty program dostarczający informacji o nazwie naszego dysku C:, jego systemie plików oraz numerze seryjnym.

Co kryje ścieżka dostępu?

Efekt działania funkcji GetVolumeInformation().

Efekt działania funkcji GetVolumeInformation().

Oprócz funkcji związanych ściśle z plikami i katalogami, przydatne okażą się także poniższe funkcje z biblioteki VCL, które ułatwiają pracę z łańcuchami znakowymi określającymi położenie pliku:

  • ExtractFileDrive( AnsiString NazwaPliku) - funkcja zwraca literę dysku, na którym znajduje się plik wskazywany przez zmienną NazwaPliku,
  • ExtractFileDir( AnsiString NazwaPliku) - funkcja zwraca ścieżkę dostępu do katalogu, w którym znajduje się plik wskazywany przez zmienną NazwaPliku,
  • ExtractFilePath( AnsiString NazwaPliku) - podobnie jak wcześniej, ale zwrócony łańcuch jest zakończony znakiem \ (w przypadku podkatalogu) lub : (w przypadku katalogu głównego),
  • ExtractFileName( AnsiString NazwaPliku) - funkcja zwraca nazwę pliku wskazywanego przez zmienną NazwaPliku,
  • ExtractFileExt( AnsiString NazwaPliku) - funkcja zwraca rozszerzenie pliku wskazywanego przez zmienną NazwaPliku.
Dla przykładowego ciągu znaków c:\\Program Files\\Dokumenty\\text.txt zapisanego w zmiennej NazwaPliku, poszczególne funkcje zwrócą następujące wyniki:

c:

c:\Program Files\Dokumenty

c:\Program Files\Dokumentytext.txt

.txt

Pliki i katalogi - metoda 1

Funkcje operujące na ścieżkach dostępu.

Funkcje operujące na ścieżkach dostępu.

Do pracy z plikami i katalogami potrzebnych jest kilka operacji, tj. tworzenie pliku, kasowanie, przenoszenie itp. Do dyspozycji mamy funkcje wymienione poniżej. Niektóre z nich pochodzą z biblioteki VCL, pozostałe z Windows API. Można je rozróżnić na podstawie typu argumentów. Funkcje VCL przyjmują zazwyczaj parametry w postaci łańcuchów znaków typu AnsiString, podczas gdy funkcje API posługują się wskaźnikiem do tablicy znaków.

  • FileExists( AnsiString NazwaPliku) - funkcja sprawdza czy podany plik istnieje i zwraca wynik typu bool, czyli wartość true lub false.

  • RenameFile( AnsiString StaraNazwa, AnsiString NowaNazwa) - jak łatwo się domyślić, funkcja zmienia nazwę pliku. Wartość zwracana przez funkcję jest, podobnie jak wcześniej, typu bool. Zmiana nazwy nie powiedzie się, gdy plik nie istnieje lub gdy nie mamy pozwolenia na zmianę nazwy.

  • FileCreate( AnsiString NazwaPliku) - tą funkcją tworzymy plik o podanej nazwie w istniejącym już katalogu. Jeżeli operacja się powiodła, wartością zwróconą jest uchwyt do pliku, gdy plik nie został utworzony funkcja zwraca wartość -1.

  • MoveFile( char* LokalizacjaObecna, char* NowaLokalizacja) - funkcja przenosi plik lub katalog wraz z jego podkatalogami do nowej lokalizacji. Za pomocą tej funkcji można również zmienić nazwę. Należy zwrócić uwagę na wartości przekazywane do funkcji, gdyż, w odróżnieniu od poprzednich funkcji, są to tablice znakowe. Jeżeli chcemy zamienić łańcuch typu String na wskaźnik do tablicy znaków char*, korzystamy z funkcji c_str(), np.:

    String zdanie = "Ala ma psa";

    char* zdanieZmienione = zdanie.c_str();

    Funkcje biblioteki VCL oraz Windows API do obsługi plików i katalogów.

    Funkcje biblioteki VCL oraz Windows API do obsługi plików i katalogów.

    Ograniczeniem funkcji jest działanie w obszarze jednego woluminu dyskowego. Jeżeli mamy dwa dyski, np. "c:\" i "d:\", nie mamy możliwości przenoszenia między nimi plików i katalogów. Pozostaje jedynie kopiowanie i usuwanie. W przypadku niepowodzenia, funkcja zwraca wynik typu int o wartości 0 lub wartość niezerową, gdy operacja się powiodła.

  • CopyFile( char* Lokalizacja, char* NowaLokalizacja, bool GdyJuzIstnieje) - przy kopiowaniu plików musimy przekazać do funkcji dodatkową wartość, która określa, co system ma zrobić, jeżeli w miejscu, do którego kopiujemy, jest już plik o takiej samej nazwie. Gdy przekażemy wartość true, funkcja nie skopiuje pliku, natomiast w przypadku wartości false plik zostanie nadpisany. Funkcja zwraca wartość 0 w razie niepowodzenia. Atrybuty pliku skopiowanego są identyczne jak oryginału.

  • DeleteFile( char* Lokalizacja) - funkcja kasuje wskazany plik. Gdy operacja się nie uda, funkcja zwraca wartość 0. Sytuacja taka może mieć miejsce wówczas, gdy któryś z uruchomionych programów korzysta z usuwanego pliku lub gdy nie ma pliku.

  • DirectoryExists( AnsiString Katalog) - funkcja działa identycznie jak FileExists(), tylko sprawdza, czy jest katalog.

  • CreateDir( AnsiString Katalog) - funkcja tworzy określony katalog i zwraca wartość true w przypadku prawidłowego wykonania operacji.

  • ForceDirectories( AnsiString Katalog) - funkcja pozwala utworzyć kilka podkatalogów za jednym razem, np.:

    katalogA\katalogB\katalogC

    Pliki i katalogi - metoda 2

    Windows API dostarcza nam bardziej zaawansowanych narzędzi do manipulowania plikami i katalogami. Mamy m.in. możliwość wizualizacji wykonywania jakiejś czynności, np. kopiowania plików, możliwość kasowania plików i katalogów z przenoszeniem do Kosza, a także obsługę wielu plików i katalogów jednocześnie. Aby mieć dostęp do tych mechanizmów, musimy dołączyć do naszego projektu plik nagłówkowy shellapi.h. Funkcja, którą będziemy się posługiwać, jest bardzo rozbudowana. Nazywa się SHFileOperation() i wykonuje różne czynności, w zależności od zawartości struktury SHFILEOPSTRUCT. Aby zacząć jej używać, musimy najpierw zadeklarować zmienną przechowującą naszą strukturę i odpowiednio ją wypełnić.

    SHFILEOPSTRUCT struktura;

    Komponenty DriveComboBox, DirectoryListBox i FileListBox powiązane przez właściwości DirList i FileList.

    Komponenty DriveComboBox, DirectoryListBox i FileListBox powiązane przez właściwości DirList i FileList.

    Poszczególne pola struktury pozwalają określić, jakie operacje będziemy wykonywać i z jakimi danymi. Pierwsze pole hwnd to uchwyt naszej aplikacji, np.:

    struktura.hwnd = Handle;

    Przypisanie uchwytu naszej aplikacji spowoduje, że kolejne czynności będziemy mogli wykonywać dopiero po zakończeniu się poprzednich operacji. Gdy przypiszemy wartość zero, wówczas zlecone czynności będą wykonywane w tle, a my będziemy mogli robić kolejne operacje.


  • Zobacz również