Проблема с записью больших временных файлов - PullRequest
1 голос
/ 26 февраля 2011

У меня есть набор больших файлов изображений, которые я использую в качестве временных файлов подкачки в Windows в Visual Studio 2010. Я пишу и считываю файлы по мере необходимости.

Проблема в том, что, хотя каждый из файлов имеет одинаковый размер, я получаю файлы разных размеров.

Итак, я могу сделать:

template <typename T>
std::string PlaceFileOnDisk(T* inImage, const int& inSize)
    TCHAR lpTempPathBuffer[MAX_PATH];
    TCHAR szTempFileName[MAX_PATH];
    DWORD dwRetVal = GetTempPath(MAX_PATH, lpTempPathBuffer);
    UINT uRetVal = GetTempFileName(lpTempPathBuffer, TEXT("IMAGE"), 0, szTempFileName);

    FILE* fp;
    fopen_s(&fp, szTempFileName, "w+");
    fwrite(inImage, sizeof(T), inSize, fp);
    fclose(fp);

    std::string theRealTempFileName(szTempFileName);

    return theRealTempFileName;

}

, но это приводит к файлам размером от 53 до 65 МБ (размер изображения 4713 *5908* (без знака).

Я подумал, что, возможно, что 'fwrite' может быть нестабильным для больших файлов, поэтому я разбил вещи на:

template <typename T>
std::string PlaceFileOnDisk(T* inImage, const int& inYSize, const int& inXSize)
    TCHAR lpTempPathBuffer[MAX_PATH];
    TCHAR szTempFileName[MAX_PATH];
    DWORD dwRetVal = GetTempPath(MAX_PATH, lpTempPathBuffer);
    UINT uRetVal = GetTempFileName(lpTempPathBuffer, TEXT("IMAGE"), 0, szTempFileName);

    int y;
    FILE* fp;
    for (y = 0; y < inYSize; y++){
        fopen_s(&fp, szTempFileName, "a");
        fwrite(&(inImage[y*inXSize]), sizeof(T), inXSize, fp);
        fclose(fp);
    }

    std::string theRealTempFileName(szTempFileName);

    return theRealTempFileName;
}

То же самое: файлы, которые сохраняются на диск, имеют переменный размер, а не ожидаемый размер.

Что происходит? Почему они не одинаковы?

Функция чтения:

template <typename T>
T* RecoverFileFromDisk(const std::string& inFileName, const int& inSize){

    T* theBuffer = NULL;
    FILE* fp;
    try {
        theBuffer = new T[inYSize*inXSize];
        fopen_s(&fp, inFileName.c_str(), "r");
        fread(theBuffer, sizeof(T), inSize, fp);
        fclose(fp);
    }
    catch(...){
        if (theBuffer != NULL){
            delete [] theBuffer;
            theBuffer = NULL;
        }
    }
    return theBuffer;
}

Эта функция может страдать от подобных проблем, но я не захожу так далеко, потому что не могу пройти функцию записи.

Я попытался использовать информацию для чтения / записи на этой странице: http://msdn.microsoft.com/en-us/library/aa363875%28v=vs.85%29.aspx

Но предложения там просто не сработали, поэтому я остановился на файловых функциях, с которыми я более знаком. Вот где я получил соглашения о присвоении имен временным файлам.

1 Ответ

0 голосов
/ 26 февраля 2011

Можете ли вы открыть изображение после того, как оно написано? Похоже, у тебя тоже проблемы с написанием?

Вы просто спрашиваете, почему размеры файлов отличаются для одного и того же размера изображения? Как насчет того, как размеры исходных файлов сравниваются друг с другом? Это может быть связано с тем, как сжимаются исходные файлы изображений.

Я не уверен, что вы делаете с файлами, но вы рассматривали более простую функцию "копирования"?

...