Programmazione c Clicca QUI per vedere il messaggio nel forum |
Spiderweb |
Ciao ragazzi, ho un problema in c..
Siccome sto programmando un client ftp e volevo implementare il resume, mi servirebbe una funzione che legge la dimensione del file che ho appena scritto... qualcuno sa come fare?
Grazie |
lorenzo |
code:
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
...
int handle;
long filesize;
handle = open("FILENAME.DAT", O_RDWR);
...
filesize = filelength(handle);
...
close(handle);
|
nous |
Lorè,a volte mi fai paura :approved:
P.s. Ma perchè apri il file in lettura e scrittura? |
lorenzo |
Originally posted by nous
P.s. Ma perchè apri il file in lettura e scrittura?
Lui parla di "file che ho appena scritto", quindi immagino che ce l'abbia già aperto da prima. |
Spiderweb |
Inserendo
int handle;
long posizione;
handle = open(retr, O_RDWR);
posizione=filelength(handle);
con gli opportuni header, dove str è una stringa contenente nome file, ottengo il seguente errore:
/home/spiderweb/tmp/ccaCZggr.o(.text+0x422): In function `resume':
: undefined reference to `filelength'
collect2: ld returned 1 exit status
come mai? |
lorenzo |
Uhm... compila ma non linka...
Vabbè, ci sono altri metodi per calcolare la dimensione del file, ma devi aprirlo come stream.
O lo apri direttamente con la fopen():
code:
FILE *stream;
stream = fopen("FILENAME.DAT", "w+");
O se ce l'hai aperto da prima con la open() lo converti in stream così:
code:
FILE *stream;
stream = fdopen(handle, "w+");
e poi usa questa funzione per calcolarti la dimensione:
code:
long file_length(FILE *stream)
{
long p, size;
p = ftell(stream);
fseek(stream, 0L, SEEK_END);
size = ftell(stream);
fseek(stream, p, SEEK_SET);
return size;
}
(Spero di aver scritto tutto giusto, non l'ho provato...) |
Lunik |
Off-Topic: a volte Lore mi lascia :shock: |
nous |
Anche a me...a che serve la ftell() ?? |
Spiderweb |
Grazie mille a tutti... però adesso ho un altro problema: quando faccio la richiesta di download al server, lui riempie tutto il buffer della socket. Però il buffer della socket è limitato, nel senso che non posso mica allocare un array di 600mega: sapete come posso far dividere il file o allocare la dimensione del mio buffer dinamicamente?
Grazie |
nous |
Off-Topic: Ma perchè non usi smartFTP? :D:D:D |
CLod |
forse xkè deve fare un progetto per l'uni... |
nous |
Prova ad allocare memoria dinamicamente con la malloc passandole come parametro il sizeof del file che ti interessa. |
lorenzo |
Originally posted by Spiderweb
Però il buffer della socket è limitato, nel senso che non posso mica allocare un array di 600mega
code:
if ((var = (char *)malloc(629145600)) == NULL)
fprintf(stderr, "Not enough memory.\n"); // :roll: :D
Beh, con una partizione di swap sufficientemente grande potresti anche farlo...
Non riesci a fare un buffer più piccolo che una volta pieno lo svuoti sul disco? |
LazerPhEa |
Originally posted by Spiderweb
Grazie mille a tutti... però adesso ho un altro problema: quando faccio la richiesta di download al server, lui riempie tutto il buffer della socket. Però il buffer della socket è limitato, nel senso che non posso mica allocare un array di 600mega: sapete come posso far dividere il file o allocare la dimensione del mio buffer dinamicamente?
Grazie
Una curiosità: hai cercato nell'RFC cosa dice riguardo alla politica di flow control lato sender? |
|
|
|