Centrum skryptów - Systemy operacyjne

Jak utworzyć plik o określonej wielkości za pomocą skryptu?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak utworzyć plik o określonej wielkości za pomocą skryptu?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak tworzy się pliki o określonej wielkości za pomocą skryptu?

-- RE

Cześć Skrypciarze! Odpowiedź

Cześć, RE! Pewnie myślisz sobie: krótkie pytanie, krótka odpowiedź. Życie to jednak zdecydowanie nie rurki z kremem, więc i odpowiedź taką rurką nie będzie (a może to było „Rock’n’roll to nie rurki z kremem”, mniejsza, skrypty przecież też nimi nie są), chociaż postaram się zrobić wszystko, by przyprowadzić czytelników jak najbliżej jak się da do tego kiosku, gdzie je sprzedają.

Myślę, że nasz kiosk o nazwie „pliki o określonej wielkości utworzone za pomocą skryptu” może mieścić się gdzieś w pobliżu:

Const ForWriting = 2



intBytes = InputBox("Enter the size of the file, in bytes:", "File Size")



intBytes = intBytes / 2



Set objFSO = CreateObject("Scripting.FileSystemObject")



Set objFile = objFSO.CreateTextFile _

    ("Testfile.txt", ForWriting, True)



For i = 1 to intBytes

    objFile.Write "."

Next



objFile.Close
Uwaga. Jak to „w pobliżu”? No w pobliżu. Jeżeli skrypt miałby utworzyć plik o wielkości 33 tys. bajtów, to jego realna wielkość wynosiłaby 33.002 bajty, natomiast żądany plik o wielkości 1.000.000 bajtów będzie miał tak właściwie 1.000.002 bajty. Więc raczej „w pobliżu” niż dokładnie tam. W ten sposób się zabezpieczam, nie chcę, żeby ktokolwiek podał mnie do sądu o jakieś 2 bajty. Wystarczy, że musieli to przeżyć kolesie, którzy w ulotce zapomnieli napisać, że psów w mikrofalówce się pod żadnym pozorem nie suszy. Te dodatkowe dwa bajty są niczym innym jak znacznikiem końca pliku i oczywiście można tak dostosować nasz skrypt, żeby wziął je pod uwagę. Tylko gra chyba nie jest warta świeczki...

Jak zatem działa nasz skrypt? Otóż oparliśmy go na prostym założeniu, że jedna kropka w pliku tekstowym będzie zajmować 1 bajt danych (i tym samym utworzy jednobajtowy plik tekstowy). Niestety okazało się, że jest to błędne założenie, bo każdy plik, jaki chcieliśmy uzyskać, w końcu okazywał się dwa razy większy niż planowany. Na szczęście opanowaliśmy już proste działanie matematyczne jakim jest dzielenie, całość podzieliliśmy zatem przez dwa i (o dziwo!) uzyskaliśmy plik o żądanej wielkości.

Powyższe to tylko ogólna zasada, teraz trochę dokładniej. Zaczynamy tworząc stałą o nazwie ForWriting, nadajemy jej wartość 2, po czym używamy jej do utworzenia naszego pliku tekstowego. Następnie przy pomocy poniższego wiersza kodu przywołujemy pole umożliwiające wprowadzenie danych, w które użytkownik wpisuje żądaną wielkość podaną w bajtach:

intBytes = InputBox("Enter the size of the file, in bytes:", "File Size")

Pamiętać należy, że skrypt nie zawiera obsługi błędów, dlatego też nie zadziała, jeżeli w pole wprowadzimy inne dane niż liczbę. Co więcej, skryptu nie można też anulować, zatem po naciśnięciu przycisku Cancel działanie skryptu się po prostu nie powiedzie. Jeżeli jednak spodziewacie się jakiejś bardziej subtelnej metody na wyjście ze skryptu, to możecie zmodyfikować swój skrypt tak, żeby wyglądał w sposób następujący (dodajemy tu fragment If-Then):

intBytes = InputBox("Enter the size of the file, in bytes:", "File Size")



If intBytes = "" Then

    Wscript.Quit

End If

Pierwszy wiersz kodu przywołuje funkcję InputBox, docelowy rozmiar pliku jest przechowywany w zmiennej o nazwie intBytes. Ponieważ, jak już wiemy, nasz plik jest dokładnie dwa razy większy, poniższy wiersz kodu dzieli nam tę wielkość na 2:

intBytes = intBytes / 2

Teraz możemy już utworzyć plik. Dla poczatkujących: tworzymy wystąpienie obiektu Scripting.FileSystemObject i tworzymy nowy plik tekstowy za pomocą następującego fragmentu kodu:

Set objFile = objFSO.CreateTextFile _

    ("Testfile.txt", ForWriting, True)

Przywołujemy przy tym metodę CreateTextFile, nadając jej trzy parametry:

Testfile.txt, czyli ścieżka, jaką chcemy utworzyć (ponieważ nie sprecyzowaliśmy całej ścieżki, nasz plik zostanie utworzony w tym samym pliku, w którym znajduje się skrypt)
ForWriting, stała, która informuje skrypt o tym, że zamierzamy tworzyć zapisy w nowym pliku
True, który instruuje skrypt, aby zastąpił istniejące wystąpienia pliku Testfile. Jeżeli plik Testfile.txt już istnieje, skrypt go automatycznie zastąpi, natomiast jeżeli jeszcze nie został utworzony, skrypt go dopiero utworzy.

Mamy zatem już plik na którym chcemy pracować. Teraz, przy pomocy poniższego fragmentu kodu, nadajemy mu żądany rozmiar:

For i = 1 to intBytes

    objFile.Write "."

Next

Nic zaskakującego, uruchamiamy tylko pętlę For Next, która działa od 1 i przechodzi przez całą wartość zmiennej. W pętli musimy tylko za każdym razem doczepić kropkę na końcu pliku, jeśli mamy to juz za sobą, nasz plik Testfile.txt powinien wyglądać w następujący sposób:

................................................................................

................................................................................

................................................................................

................................................................................

................................................................................

Może nie jest to tak ekscytujące jak instrukcja obsługi mikrofalówki, ale zawsze coś. Po dopisaniu ostatniej kropki wychodzimy z pętli, wywołujemy metodę Close i tak w sumie, to na tym kończymy.

Nie testowaliśmy skryptu na wszystkich platformach ani przy różnych wielkościach plików. Jednak po utworzeniu pliku docelowego o rozmiarze 10 000 000 bajtów (ok.10 MB) otrzymaliśmy (niespodziewanie!) plik o wielkości 10.000.002 bajtów. Wnioski proszę wysnuć samodzielnie.

Całkiem blisko naszego kiosku, no nie? Aż zgłodniałem, zostawiam Was więc z wnioskami, a sam lecę na te rurki z kremem. Pamiętajcie jednak: nie suszcie psów w mikrofalówce, a po papierowych kubkach z herbatą możecie spodziewać się, że zawartość jest gorąca.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne