Почему вызов stat () возвращает неправильное значение нуля (0) для размера файла? - PullRequest
1 голос
/ 28 ноября 2011

Я запускаю многопоточное приложение для Windows c ++, в котором один экземпляр / поток класса сервера добавляет к файлу.Другие потоки запускают клиентские экземпляры, которые загружают файл только при запуске каждого клиента.Когда я добираюсь до 2k байтов от конца загрузки файла, я проверяю, изменился ли размер файла, поэтому я знаю, чтобы обновить, сколько всего байтов нужно прочитать.Время от времени размер файла, который я получаю, ошибочно определяется как ноль (0).Я использую статистический вызов ниже для этого.Когда возвращается ноль, то в качестве проверки работоспособности я затем вызываю getFileSizeWithTellg (), чтобы увидеть, что он возвращает, и возвращает ожидаемое ненулевое значение.Значение, которое равно или больше, чем начальное значение.Я понимаю, что приведение к unsigned int может быть проблематичным, но файлы никогда не превышают 5 mgBytes.

Что может быть причиной того, что вызов stat () возвращает нулевое значение, когда вызов ..Tellg не«т?Спасибо за понимание этого.

/

/ snippets from methods in different classes
//
// from client class
ifstream fileSeqIn
fileSeqIn.open(fName.c_str(), ios::in | ios::binary |ios::ate); 
// to get initial size
size = fileSeqIn.tellg();
fileSeqIn.seekg(0, ios::beg);


// later to determine if the file has grown
struct stat filestatus;
unsigned int size;
if (stat(fName, &filestatus ) == 0) {
     size = (unsigned int)filestatus.st_size;   
}

//
unsigned int getFileSizeWithTellg(char *fname)
{
    // get length of file
    is.open (fname, ios::binary );
    is.seekg (0, ios::end); 
    length = is.tellg();
    is.close();
    return(length);
}


//-----------------------------------------------------------------------------
// from server class
ofstream fileSeqOut;
fileSeqOut.open(fName.c_str(), ios::app | ios::out |ios::ate |ios::binary);

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Если то, что Ларри Остерман сказал верно, использование GetFileInformationByHandle может решить проблему.

1 голос
/ 28 ноября 2011

Одно существенное отличие: stat возвращает системное представление о размере файла;tellg возвращает значение, зависящее от внутреннего состояния потока.Потоки файловых баз буферизуются, и данные могут не передаваться в систему, пока вы не очистите или не закроете файл.Получаете ли вы ту же разницу, если перед вызовом stat происходит сброс потока?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...