Chciałbym utworzyć plik rzadki tak, aby wszystkie bloki zerowe nie zajmowały rzeczywistej przestrzeni dyskowej, dopóki nie zapiszę do nich danych. Czy to możliwe?Jak programowo utworzyć plik C w systemie Mac OS X?
Odpowiedz
Podobnie jak w innych Uniksach, jest to funkcja systemu plików. Albo system plików obsługuje go dla WSZYSTKICH plików, albo nie. W przeciwieństwie do Win32, nie musisz robić nic specjalnego, aby to się stało. Również w przeciwieństwie do Win32, nie ma kary za wydajność w przypadku używania pliku rozrzedzonego.
W systemie MacOS domyślny system plików to HFS +, który obsługuje , a nie pliki pomocnicze w postaci sparse.
Aktualizacja: MacOS używany do obsługi woluminów UFS z nieobsługiwaną obsługą plików, ale został usunięty. Żaden z obecnie obsługiwanych systemów plików nie obsługuje obsługi plików rozproszonych.
Hmmm ... w pewnym sensie widelec danych jest unixowy, a widelec zasobów jest wyspecjalizowanym dziwakiem, nie? To nie ma znaczenia. Twoje zdrowie. – dmckee
Tak, "widełek zasobów" jest archaiczny. Większość programów zajmuje się tylko "widelcem danych". – ephemient
Dzięki - będę edytować mój komentarz, aby naprawić mój błąd. –
hdiutil może obsługiwać rzadkie obrazy i pliki, ale niestety struktura, z którą się łączy jest prywatna.
Możesz spróbować zdefiniować zewnętrzne symbole zdefiniowane przez framework DiskImages poniżej, ale jest to najprawdopodobniej niedopuszczalne dla kodu produkcyjnego, a także dlatego, że framework jest prywatny, musisz odwrócić jego przypadki użycia.
Cristi: ~ diciu $ otool -L/usr/bin/hdiutil
/usr/bin/hdiutil: /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages (wersja 1.0 Kompatybilność .8, obecna wersja 194.0.0) [..]
cristi: ~ diciu $ nm /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages | awk -F '' '{print $ 3}' | C++ filt | grep -i rzadki
[..]
CSparseFile :: sector2Band (długie długości)
CSparseFile :: addIndexNode()
CSparseFile :: readIndexNode (długie długości SparseFileIndexNode *)
CSparseFile :: readHeaderNode (CBackingStore * SparseFileHeaderNode *, unsigned long)
[... cięcia dla zwięzłości]
Później Edit
Ty mógł użycie hdiutil jako proces zewnętrznego i mieć go utworzyć rzadki obraz dysku dla Ciebie. Z procesu C utworzysz plik w (zamontowanym) rzadkim obrazie dysku.
Witam, muszę tylko kopać w prywatne framworks 'hdiutil' w celu automatycznego dołączenia pliku DMG (plik reprezentujący obraz dysku z partycją HFS +). Zastanawiam się, czy zdarzy ci się wykopać trochę wewnątrz struktury DiskImages i poszukać odpowiedniej metody?dzięki – Zohar81
Jeśli chcesz przenośność, ostatnią deską ratunku jest napisanie własnej funkcji dostępu, aby zarządzać indeksem i zestawem bloków.
W istocie zarządzasz pojedynczym plikiem, ponieważ system operacyjny zarządza dyskiem, zachowując łańcuch bloków, które są częścią pliku, mapę bitową przydzielonych/wolnych bloków itp.
Oczywiście doprowadzi to do niezoptymalizowanego i wolniejszego dostępu, polecam ten apprach tylko wtedy, gdy wymóg oszczędzania miejsca jest absolutnie krytyczny i masz wystarczająco dużo czasu, aby napisać solidny zestaw funkcji dostępu.
I nawet w takim przypadku najpierw sprawdziłbym, czy twój problem wymaga innego rozwiązania. Prawdopodobnie powinieneś inaczej przechowywać swoje dane?
Jeśli szukasz (fseek, ftruncate, ...) do końca, rozmiar pliku zostanie zwiększony bez przydzielania bloków, dopóki nie napiszesz do dziur. Ale nie ma sposobu, aby utworzyć magiczny plik, który automatycznie konwertuje bloki zer do dziur. Musisz to zrobić sam.
Może to być pomocne przy patrzeniu (polecenie OpenBSD cp wstawia otwory zamiast zapisywania zer). patch
To prawda w Linuksie, ale nie w domyślnym systemie plików Mac OS X, HFS +. Zobacz moją odpowiedź na to pytanie. – titaniumdecoy
> Jeśli szukasz (fseek, ftruncate, ...) do końca, rozmiar pliku zostanie zwiększony bez przydzielania bloków To nie wydaje się być prawdziwe na OSX –
Wydaje się, że istnieje pewne niejasności co do tego, czy domyślny system plików Mac OS X (HFS +) obsługuje otwory w plikach. Poniższy program pokazuje, że tak nie jest.
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
void create_file_with_hole(void)
{
int fd = open("file.hole", O_WRONLY|O_TRUNC|O_CREAT, 0600);
write(fd, "Hello", 5);
lseek(fd, 99988, SEEK_CUR); // Make a hole
write(fd, "Goodbye", 7);
close(fd);
}
void create_file_without_hole(void)
{
int fd = open("file.nohole", O_WRONLY|O_TRUNC|O_CREAT, 0600);
write(fd, "Hello", 5);
char buf[99988];
memset(buf, 'a', 99988);
write(fd, buf, 99988); // Write lots of bytes
write(fd, "Goodbye", 7);
close(fd);
}
int main()
{
create_file_with_hole();
create_file_without_hole();
return 0;
}
Program tworzy dwa pliki, każdy 100000 bajtów, z których jedna posiada otwór 99,988 bajtów.
W systemie Mac OS X 10.5 na partycji HFS +, oba pliki zajmują tę samą liczbę bloków dyskowych (200):
$ ls -ls
total 400
200 -rw------- 1 user staff 100000 Oct 10 13:48 file.hole
200 -rw------- 1 user staff 100000 Oct 10 13:48 file.nohole
Zważywszy na CentOS 5, plik bez otworów zużywa 88 więcej bloków dyskowych niż drugi:
$ ls -ls
total 136
24 -rw------- 1 user nobody 100000 Oct 10 13:46 file.hole
112 -rw------- 1 user nobody 100000 Oct 10 13:46 file.nohole
Ten wątek staje się kompleksowym źródłem informacji o plikach rozrzedzonych. Oto brakujące części dla Win32:
Tool that estimates if it makes sense to make file as sparse
Pozdrowienia
to wygląda OS X obsługuje rozrzedzone pliki na woluminach UDF. Wypróbowałem program testowy tyaniumdecoy na OS X 10.9 i wygenerowałem rzadki plik na obrazie dysku UDF. Ponadto, nie UFS nie jest już obsługiwany w OS X, więc jeśli potrzebujesz plików sparse, UDF jest jedynym natywnie obsługiwanym systemem plików, który je obsługuje.
Próbowałem również programu na udziałach SMB. Gdy serwer jest Ubuntu (ext4 system plików), program tworzy plik rozrzedzony, ale "ls -ls" do SMB tego nie pokazuje. Jeśli robisz "ls -ls" na samym hoście Ubuntu, pokazuje on, że plik jest rozrzedzony. Gdy serwer jest systemem Windows XP (system plików NTFS), program nie generuje rozrzedzonego pliku.
- 1. Jak utworzyć wirtualny napęd CD w systemie Mac OS X
- 2. Jak utworzyć plik "Alias" Mac OS X w terminalu?
- 3. Jak utworzyć plik wykonywalny ELF na Mac OS X?
- 4. JNotify w systemie Mac OS X?
- 5. Gdzie jest mój plik .emacs w systemie Mac OS X
- 6. /proc/uptime w systemie Mac OS X
- 7. Odinstalowywanie pakietów w systemie Mac OS X
- 8. Aktualizacje aplikacji w systemie Mac OS X
- 9. Gdzie jest standardowa biblioteka C w systemie Mac OS X?
- 10. Jak określić bernela jądra w systemie Mac OS X 10.6?
- 11. Jak wyliczyć woluminy w systemie Mac OS X?
- 12. Statystyki operacji odczytu/zapisu dysku w systemie Mac OS X
- 13. Jak zaktualizować Numpy w systemie Mac OS X Snow Leopard?
- 14. Jak programowo uzyskać żywotność baterii mac os x macbook?
- 15. Jak utworzyć usługę Windows dla Mac OS X?
- 16. Pobierz programowo rozdzielczość ekranu w OS X
- 17. Jak podłączyć przycisk do metody w systemie Mac OS X
- 18. Jak uruchomić MariaDB przy starcie w systemie Mac OS X?
- 19. Jak znaleźć numer portu szeregowego w systemie Mac OS X?
- 20. Jak zablokować kursor wewnątrz okna w systemie Mac OS X?
- 21. Jak korzystać z katalogu/home w systemie Mac OS X
- 22. Jak zainstalować nagłówki programów Python w systemie Mac OS X?
- 23. Dzielenie pliku przy użyciu AWK w systemie Mac OS X
- 24. Mac OS X darmowe kompilator C
- 25. C++ #ifdef Pytanie Mac OS X
- 26. Jak programowo utworzyć plik XSD w C#?
- 27. Jak skonfigurować plik php.ini dla mail() w systemie MAC OS?
- 28. Sposób cichej instalacji pliku pkg w systemie Mac OS X
- 29. Gdzie NSUserDefaults przechowuje dane w systemie Mac OS X?
- 30. Dziwne gniazdo RAW w systemie Mac OS X
Myślę, że warto wiedzieć, DLACZEGO chcesz mieć rzadkie pliki. –