2010-06-02 3 views
0

У меня есть на стороне сервера C на основе CGI-код, как:CGI Буферизация вопрос

cgiFormFileSize("UPDATEFILE", &size); //UPDATEFILE = file being uploaded 
cgiFormFileName("UPDATEFILE", file_name, 1024); 
cgiFormFileContentType("UPDATEFILE", mime_type, 1024); 
buffer = malloc(sizeof(char) * size); 

if (cgiFormFileOpen("UPDATEFILE", &file) != cgiFormSuccess) { 
    exit(1); 
} 
output = fopen("/tmp/cgi.tar.gz", "w+"); 

inc = size/(1024*100); 
fptr = fopen("progress_bar.txt", "w+");  
while (cgiFormFileRead(file, b, sizeof(b), &got_count) == cgiFormSuccess) 
{ 
    fwrite(b,sizeof(char),got_count,output); 
    i++; 
    if(i == inc && j<=100) 
    { 
    fprintf(fptr,"%d", j); 
    fflush(fptr); 
    i = 0; 
    j++; // j is the progress bar increment value 
    } 
} 
fclose(fptr); 
cgiFormFileClose(file); 
retval = system("mkdir /tmp/update-tmp;\ 
       cd /tmp/update-tmp;\ 
       tar -xzf ../cgi.tar.gz;\ 
       bash -c /tmp/update-tmp/update.sh"); 

Однако это не работает так, как показано выше. Вместо того, чтобы печатать 1,2, ... 100 до progress_bar.txt (упоминается fptr) один за другим, он печатает на ONE GO, кажется, что он буферизует, а затем записывает в файл. fflush() тоже не работает.

Любая подсказка/предложение было бы действительно оценено.

+1

Как вы знаете, не пишет один за другим? – Freddy

+0

Откуда вы знаете, что это происходит за один раз? Без искусственных задержек внутри цикла это почти полностью завершится. –

+0

Я не понял, что вы пытаетесь сделать, и каков ожидаемый результат. Пожалуйста, дайте больше информации. – Amirshk

ответ

0

Сначала откройте файл перед циклом и закройте его после завершения. Слишком много ввода-вывода.

Проблема здесь w+ - это усекает ваш файл. используйте a+. (fopen помощь)

+0

Я тоже пробовал. Откройте файл перед циклом и закройте его после цикла, он тоже не работает. Я не хочу добавлять данные, я хочу обновлять данные каждый раз, поэтому я использовал w + – Punit

+0

, то почему вы используете fseek? – Amirshk

+0

Чтобы распечатать значение в начале файла каждый раз, однако в этом случае это не обязательно, так как каждый раз открывать и закрывать файлы делаются. – Punit

0

Это является писать это один за другим, это просто, что он делает это так быстро, что вы исчезающе вряд ли когда-нибудь файл со значением, чем 99 в нем.

Это легко продемонстрировать, если вы поместили sleep(1) в петлю, так что это достаточно медленно, чтобы вы могли ее поймать.

+0

Он делает это (я пробовал спать (1);), но не в нужную точку. Как только CGI выполнит копирование данных и запись в текстовый файл; после этого он печатает в текстовый файл. – Punit

+0

Что заставляет вас думать, что 'cgiFormFileRead()' вызывается медленно, как загружается файл? Похоже, что загруженный файл полностью заполнен буфером, а затем предоставлен в ваш CGI. – caf

+0

Вы правы, что-то подобное происходит. Однако я не понял, что «cgiFormFileRead() вызывается медленно, поскольку файл загружает« Есть ли у вас какие-либо идеи, что мне следует попробовать сейчас? – Punit