Créer un fichier vide en C. [Résolu] - C - Programmation
Marsh Posté le 07-12-2005 à 22:00:56
Tu peux utiliser truncate ou ftruncate, le prototype doit etre du truncate( nom_du_fichier, longueur ), si la taille du fichier ou du descripteur spécifié est inférieure à longueur le fichier est étendu et la différence entre l'ancienne EOF et la nouvelle est matérialisée par un trou (ie des 0 qui ne sont pas alloues physiquement sur le disque)
Marsh Posté le 07-12-2005 à 22:05:54
meumeul a écrit : Je souhaite allouer une certaine place a un fichier, et le remplir par la suite. |
Je pense qu'il y a un problème de conception quelque part. Que veux tu faire exactement ?
Sinon, pour créer un fichier de 200 octets (à 0, par exemple) :
|
|
Marsh Posté le 07-12-2005 à 22:28:35
meumeul, ton code est bon a deux choses pres :
1) C'est O_CREAT | O_WRONLY, qu'il faut utiliser, pas seulement O_CREAT
2) write prend en argument l'adresse du buffer que tu veux ecrire, pas directement les donnees que tu veux ecrire. Donc c'est write(fd, &c, 1) avec char c = 0, pas write(fd,"0",1).
Mais attention, le resultat n'est pas forcement ce a quoi tu t'attend. Suivant l'OS et suivant l'offset du lseek (i.e. avec un grand offset), tu peux te retrouver avec un "sparse file". Ca ne fait aucune difference en pratique (quand tu le lit, tu vois ce que tu as ecrit, et des 0 ou tu n'as pas ecrit), mais tout le fichier ne correspond pas forcement a des donnees sur le disque. Autrement dit ls -l te donnera la bonne taille (celle du lseek + 1), mais le fichier occupe moins de place que ca sur le disque.
Demonstration :
Code :
|
# ls -l sparse_file |
Dans l'exemple ci-dessus on voit que le fichier fait bien 100Mo, mais seulement deux blocs sont alloues sur le disque (8Ko, un bloc etant 4Ko sur ma machine). Par contre si je le lis, je vois bien mon 'a', un autre 'a' 100Mo plus loin, et des 0 entre.
Marsh Posté le 07-12-2005 à 23:02:51
matafan a écrit : meumeul, ton code est bon a deux choses pres :
|
Hum... avoir un chmod aléatoire sur un fichier lors de sa création n'est pas franchement une bonne idée (surtout que dans ton cas ça a donné un setuid sur un fichier appartenant à "root" !!!)
=> fd = open("sparse_file", O_CREAT | O_WRONLY, 0644);
Ou bien, pour vraiment être rigoureux
=> fd = open("sparse_file", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
Marsh Posté le 08-12-2005 à 00:06:11
Exact, oublie de ma part. En fait au debut j'avais pas de O_CREAT dans mon code, donc pas besoin de mode... Puis j'ai ajoute O_CREAT en oubliant d'ajouter le mode.
Marsh Posté le 08-12-2005 à 12:08:13
matafan a écrit :
|
Ne vaut-il pas mieux comparer "if (write(...) < 0)" ???
Marsh Posté le 08-12-2005 à 15:49:14
Sve@r a écrit : Hum... avoir un chmod aléatoire sur un fichier lors de sa création n'est pas franchement une bonne idée (surtout que dans ton cas ça a donné un setuid sur un fichier appartenant à "root" !!!) |
trés rigoureuse remarque, je n'avais aucun droit sur ce fichier, et je ne captais pas pourquoi ...
merci, ca marche nickel. je vais essayer de le réouvrir et d'ecrire des blocs un peu partout dedans
maintenant...
Marsh Posté le 08-12-2005 à 17:09:22
Ok j'ai reussi à faire tout ce que je voulais, merci pour votre aide, tout n'était qu'en gros, une histoire de droits ... Merci pour les precision quand aux tailles des fichiers.
++
Marsh Posté le 07-12-2005 à 21:03:46
Bonjour,
Je souhaite allouer une certaine place a un fichier, et le remplir par la suite.
Mettons que je veux faire un fichier vide de 200 octets , je fais
ca me cree bien un fichier data2 mais de 0 octets :S j'avais d'abord essayer un lseek de 200 sans rien écrire,
mais cela ne marchait pas non plus ...
je sais que c'est une question trés bête, ne me linchez pas please
merci
Message édité par meumeul le 08-12-2005 à 17:09:37