AutoIt/Czytanie i pisanie do plików

Otwierania i zamykanie plików

edytuj

Pierwszą ważną funkcją jest FileOpen, powoduje ona otwarcie pliku tekstowego. Otwarcie pliku jest konieczne aby można było czytać z pliku lub do niego zapisywać.

FileOpen ( "nazwa_pliku" [, mode ] )

Funkcja zwraca uchwyt do pliku lub -1 gdy otwarcie pliku nie powiodło się.

Uchwyt jest to liczbowy identyfikator, którego możemy używać zamiast nazwy pliku (łącznie ze ścieżką dostępu). Operowanie uchwytami jest o wiele szybsze niż nazwami plików.

Funkcja ta ma dwa parametry:

"nazwa_pliku" - nazwa otwieranego pliku, może być ze ścieżką dostępu

Drugi parametr jest opcjonalny tzn. że może być pominięty jeżeli odpowiada nam jego wartość domyślna:

mode - określa sposób otwarcia pliku

0 - otwiera plik tylko do odczytu, jeżeli plik nie istnieje nie jest tworzony (wartość domyślna)

1 - otwiera plik do zapisu, dopisywanie na końcu pliku, jeżeli plik nie istnieje jest tworzony

2 - usuwa poprzednią zawartość pliku i otwiera go do zapisu, jeżeli plik nie istnieje jest tworzony

4 - odczytuje plik w trybie RAW (odczyt i zapis)

Dodanie wartości 8 spowoduje utworzenie struktury folderów, o ile te nie istnieją.

Przykład:

$handle=FileOpen("C:\Windows\tymczasowy\Test.txt",9) ;1+8 otwiera plik do zapisu
                       ;jeżeli nie istnieje zostanie utworzony wraz z katalogiem


Kolejną funkcją jest:

FileClose (uchwyt)

Zamyka ona uprzednio otwarty plik. Jedynym jej parametrem jest uchwyt do pliku, odczytany funkcją FileOpen.

Funkcja zwraca 1 gdy operacja zakończyła się sukcesem, lub 0 gdy wystąpił błąd.

Przykład:

$handle=FileOpen("C:\Windows\tymczasowy\Test.txt",9)
FileClose($handle)

Zamykanie plików jest bardzo ważne, pozwala oszczędzić trochę pamięć komputera.


Zapis do plików

edytuj

Pierwszą funkcją która zapisuje dane do pliku jest:

FileWrite ( uchwyt|"nazwa_pliku", dane )

Funkcja dopisuje dane na końca pliku. Zwraca 1 gdy sukces lub 0 gdy wystąpił błąd.

Parametry:

uchwyt|"nazwa_pliku" - uchwyt do pliku lub jego nazwa

dane - dopisywane dane (tekstowe lub binarne)

Przykład:

$handle=FileOpen("Test.txt",1)
FileWrite($handle,"Jakiś tekst")
FileClose($handle)

Po uruchomieniu tego skryptu w katalogu roboczym zostanie utworzony plik Test.txt (jeżeli nie istnieje), zaś w nim tekst "Jakiś tekst". Oczywiście zamiast nazwy pliku można podać pełną ścieżkę, wtedy plik zostanie utworzony w opisanej tą ścieżką lokacji.

Istnieje pewna istotna różnica między użyciem uchwytu, a użyciem nazwy pliku. Uchwytu można użyć tylko gdy plik został uprzednio otwarty, natomiast podanie nazwy pliku powoduje automatyczne otwarcie pliku, a po zakończeniu zapisu jego zamknięcie. Wydawało by się, że druga metoda jest prostsza, ale nie zawsze jest optymalna (patrz poniższy przykład).

FileWrite zapisuje dane ciągiem, aby zaznaczyć koniec linii musimy dopisać @CRLF.

FileWrite("Test.txt","Jakiś tekst")
FileWrite("Test.txt", @CRLF)           ; Koniec linii
FileWrite("Test.txt","Jakiś tekst 2")	;już w nowej linii

lub z użyciem uchwytów:

$handle=FileOpen("Test.txt",2)
FileWrite($handle,"Jakiś tekst")
FileWrite($handle, @CRLF) ; Koniec linii
FileWrite($handle,"Jakiś tekst 2")	;już w nowej linii
FileClose($handle)

W pierwszym przykładzie plik będzie otwierany i zamykany 3 razy, w drugim tylko raz. Użycie uchwytu wprawdzie wydłużyło skrypt o 2 linie, ale skróciło czas jego wykonywania.

Ma to szczególnie znaczenie przy skomplikowanej edycji dużych plików tekstowych.


Drugą funkcją zapisującą dane do pliku jest FileWriteLine. Ta funkcja różni się od poprzedniej tym, że zawsze dopisuje dane od nowej linii, oraz że nie stosuje się jej do plików binarnych:

FileWriteLine ( uchwyt|"nazwa_pliku", "tekst" )

Przykład:

FileWriteLine("Test.txt","Jakiś tekst")
FileWriteLine("Test.txt","Jakiś tekst 2")


Czytanie z plików

edytuj
FileRead ( uchwyt|"nazwa_pliku" [, count] )

Funkcja zwraca wczytane dane tekstowe lub binarne. Opcjonalny parametr count określa ile znaków (bajtów) ma być wczytane.

Przykład:

MsgBox(0,"Test", FileRead("Test.txt",5)) ;zostanie odczytanych pierwszych 5 znaków


Drugie polecenie to FileReadLine - służy do odczytania z pliku tekstowego wybranej linii tekstu:

FileReadLine ( uchwyt|"nazwa_pliku" [, nr_linii] )

nr_linii - numer wczytywanej linii tekstu, wartość domyślna to 1, -1 oznacza ostatnią linię

Przykład:

MsgBox(0,"Test", FileReadLine("Test.txt",2))  ;zostanie wczytany drugi wiersz tekstu


Inne operacje na plikach

edytuj

Sprawdzanie czy istnieje dany plik lub folder

edytuj
FileExists ( "path" )

Jeżeli tak to zwraca 1, w przeciwnym razie 0.

Przykład:

MsgBox(0,"Test",FileExists("c:\windows\"))  ;czy istnieje folder
MsgBox(0,"Test",FileExists("test.txt"))     ;czy istnieje plik, sprawdzanie w folderze bieżącym

Usuwanie pliku lub całego folderu

edytuj
FileDelete ( "path" )

Zwraca 1 gdy sukces, 0 gdy wystąpił błąd lub plik (folder) nie istnieje.

Przykład:

MsgBox(0,"Test",FileDelete("test.txt"))

Kopiowanie wskazanego pliku (lub plików)

edytuj
FileCopy ( "źródło", "cel" [, flag] )

Funkcja zwraca 1 gdy sukces, 0 gdy wystąpił błąd.

Parametry:

"źródło" - nazwa i ścieżka dostępu pliku źródłowego (można stosować wieloznaczniki "*" i "?" (ang. Wildcards))

"cel" - ścieżka docelowa kopiowanych plików

Parametr opcjonalny:

flag - określa sposób zapisu pliku docelowego

0 - istniejące pliki nie są nadpisywane (domyślne)

1 - pliki są nadpisywane

Dodanie wartości 8 spowoduje utworzenie struktury folderów, o ile te nie istnieją.

Przykład (skopiowanie wszystkich plików z rozszerzeniem txt z folderu "old" na dysku C, do folderu "new" na dysku D):

FileCopy("c:\old\*.txt", "d:\new\")

Ustawienie katalogu bieżącego

edytuj
FileChangeDir ( "path" )

"path" - ścieżka do folderu, który ma być ustawiony jako bieżący.

Dzięki temu nie będziemy musieli podawać pełnej ścieżki, gdyż pliki będą szukane w folderze bieżącym.

Funkcja zwraca 1 gdy sukces, gdy nie znaleziono podanego folderu.

Przykład (ustawienie jako domyślny folder systemowy Windows (ścieżka do tego folderu jest zwracana przez makro @WindowsDir)):

FileChangeDir(@WindowsDir)


Selektory plików i folderów

edytuj

Selektor plików FileOpenDialog

edytuj
FileOpenDialog ( "nazwa", "folder_startowy", "filtr" [, opcje [, "domyślna_nazwa" [, hwnd]]] )

Wywołuje systemowy selektor i zwraca pełną ścieżkę do wybranego pliku. Jeżeli wybrana była grupa plików, to w zwracanej ścieżce nazwy plików są rozdzielone znakiem pionowej kreski np.: "d:\mój_katalog|plik1.txt|plik2.txt|plik3.txt"

Jeżeli wystąpi błąd, to makro @error przyjmuje wartość:

1 - wybór pliku nie powiódł się

2 - zły filtr plików

Funkcja ustawia folder bieżący (na ten z którego został wybrany plik) oraz makro @WorkingDir (makro to zwraca ścieżkę do folderu bieżącego).

Parametry:

"nazwa" - nazwa okna selektora

"folder_startowy" - ścieżka do folderu startowego, pusty string oznacza folder bieżący

"filtr" - filtr nazw plików, można używać wieloznaczników (np. "(*.*)" - wszystkie pliki, "(*.jpg)" - obraz jpg.

Można łączyć alternatywnie kilka filtrów w grupę np.: "(*.jpg; *.gif; *.bmp)"), przed nawiasem może być wstawiony opis np.: "Obrazki(*.jpg; *.gif; *.bmp)"

Można także utworzyć kilka grup filtrów, rozdzielając je znakiem pionowej kreski | np.:"Dokumenty(*.txt; *.doc; *.odt)|Obrazki(*.jpg; *.gif; *.bmp)"

Parametry opcjonalne:

opcje - określają sposób działania selektora (domyślnie 0)

1 - plik musi istnieć (jeżeli nazwa pliku została wpisana w okienku nazwy pliku)

2 - ścieżka musi istnieć (jeżeli została wpisana w okienku nazwy pliku)

4 - zezwala na wybór grupy plików

Dodanie wartości 8 spowoduje utworzenie struktury folderów, o ile te nie istnieją.

"domyślna_nazwa" - sugerowana nazwa pliku wyświetlana w okienku nazwy pliku (domyślnie brak nazwy)

hwnd - uchwyt do okna nadrzędnego. W momencie zamknięcia okna selektora uaktywni się właśnie to nadrzędne okno. (dokładny opis w rozdziale "Wyskakujące okna - prosta interakcja ze skryptem"

Przykład:

$file=FileOpenDialog("Wybierz plik","","Dokumenty(*.txt; *.doc; *.odt)|Obrazki(*.jpg; *.gif; *.bmp)",4))
MsgBox(0,"Test",$file)

Selektor plików FileSaveDialog

edytuj
FileSaveDialog ( "nazwa", "folder_startowy", "filtr" [, opcje [, "domyślna_nazwa" [, hwnd]]] )

Funkcja różni się od FileOpenDialog tylko tym, że w oknie selektora zamiast przycisku "Otwórz" jest przycisk "Zapisz".

Inne są też wartości parametru opcje (domyślna wartość 0):

2 - ścieżka musi istnieć

16 - wyświetla ostrzeżenie przy nadpisywanu plików

Selektor folderów

edytuj
FileSelectFolder ( "nazwa", "obszar" [, opcje [, "folder_startowy" [, hwnd]]] )

Wywołuje systemowy selektor i zwraca ścieżkę do wybranego folderu.

Jeżeli wystąpił błąd, lub użytkownik wybrał przycisk "Anuluj", to zwrócony jest pusty string, a makro @error=1.

Parametry:

"nazwa" - nazwa okna selektora

"obszar" - obszar udostępniony do przeszukiwania, dla "" obszarem jest cały desktop, można ograniczyć do pojedynczego dysku lub katalogu, np.: "f:\"

Parametry opcjonalne:

opcje - określa sposób działania selektora (domyślnie 0):

1 - dodatkowo przycisk tworzenia nowego folderu

4 - dodatkowo okienko edycyjne nazw folderów

"folder_startowy" - ścieżka do folderu startowego, który zostanie wybrany jeśli istnieje, domyślnie string posty, czyli folder startowy nie jest określony

Przykład:

MsgBox(0,"TEST",FileSelectFolder("Wybierz folder”, "c:\", 0, "c:\windows\"))


Instalator

edytuj

Ciekawą funkcją jest FileInstall. Umożliwia ona dołączenie do skompilowanego skryptu dowolnych dodatkowych plików. Po uruchomieniu tak skompilowanego skryptu pliki te zostaną wypakowane w zadanej lokalizacji. Mechanizm ten pozwala w prosty sposób napisać instalator, który stworzy środowisko pracy programu i umieści w nim różne dodatkowy pliki niezbędne do jego działania np. grafiki, dźwięki, teksty, bazy danych itp.

Jeżeli skrypt uruchomimy w trybie interpretacji to funkcja działa jak FileCopy.

FileInstall ( "źródło", "cel" [, flag] )

przykład:

 FileInstall("instal\logo.jpg", "pic\logo.jpg")
 FileInstall("instal\sound.wav", "wave\gong.wav")
 FileInstall("instal\text.txt", "manual\readme.txt",1)

UWAGA: ”źródło” nie może być zmienną, natomiast ”cel” może.

Flaga 1 powoduje nadpisanie istniejących plików, 0 (domyślne) nie nadpisuje.


Drukowanie pliku tekstowego

edytuj

_FilePrint($s_File [, $i_Show = @SW_HIDE]) – drukowanie pliku tekstowego

 #Include <File.au3>
 FilePrint($plik_tekstowy_do_wydruku)