Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемма с массивом CAtlFile, Проблемма с массивом CAtlFile 
:(
    Опции темы
heavix
Дата 8.6.2011, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 10.8.2007

Репутация: нет
Всего: нет



Доброго времени суток.
Уважаемые господа прошу вашей помощи! В Виндах я недавно... 

у меня есть 3 файла с хитрой структурой... я вычитываю из них определенные блоки и хочу записать их в
3 других файла... для этого создаю массив из 3-x объектов CAtlFile...
И в цикле поочередно открываю подгатавливаю их заголовки и записываю... 
Проблемма состоит в том что для первой итерации цикла все ок, а уже в следующей метод CAtlFile::Create 
не создает файл... код следующий:

Код

HRESULT DiskStorageMap::UpdateStoresAndRecords()
{
  HRESULT rv;
  CPath path(mStorageDirectory);

  // Create 3 temporary files  
  CAtlFile tmp_file[3];

  for(int i=0; i < 3; i++)
  {
    CString fileName;
    // Get block size and bitmap size for current index
    unsigned long blockSize = GetBlockSizeForIndex(i+1);
    unsigned long bitmapSize = GetBitMapSizeForIndex(i+1);
    unsigned long Words;
    if(mHeader.mVersion == CDisk::Version3)
      Words = 1024;
    if(mHeader.mVersion == CDisk::Version4)
      Words = bitmapSize/4;
    // allocate BitMap
    unsigned long* BitMap = new unsigned long[Words];
    if (!BitMap) 
    {
      rv = E_OUTOFMEMORY;
      goto error_exit;
    }
    // filling current BitMap by zeros
    for (int j = 0; j < Words ; j++,BitMap[j]= 0x00000000);
    // open current  file
    fileName.Format(L"_FILE_TMP_%003d_",i + 1);
    path.Append(fileName);

    tmp_file[i].Create(path.m_strPath,
                       GENERIC_READ | GENERIC_WRITE, 
                       FILE_SHARE_READ|FILE_SHARE_WRITE, 
                       CREATE_ALWAYS);

    if(!tmp_file[i])// на второй итерации здесь true!!!
    {
      delete [] BitMap;
      rv = E_OPENFILE;
      goto error_exit;
    }
    // write Bitmap to temp file
    tmp_file[i].Seek(0, PR_SEEK_SET);
    ULONGLONG nPos = 0;
    tmp_file[i].GetPosition(nPos);
    ULONGLONG filePos = nPos;

    if (filePos != 0){
      delete [] BitMap;
      rv = E_UNEXPECTED;
      goto error_exit;
    }

    DWORD bytesWritten = 0;
    tmp_file[i].Write(BitMap, (Words*4), &bytesWritten);

    if (bytesWritten < (Words*4))
    {
      delete [] BitMap;
      rv = E_UNEXPECTED;
      goto error_exit;
    }

    delete [] BitMap;
  }
... здесь еще много кода...

// if error occured  - close all open files
error_exit:
  if(E_OPENFILE != rv)
    for( int i = 0 ; i<3 ; i++ )
      if(tmp_file[i])tmp_file[i].Close();

  return rv;
}


Я в ступоре... кажется что-то совсем простое - но не могу понять что...



Это сообщение отредактировал(а) heavix - 8.6.2011, 01:38
PM MAIL   Вверх
volatile
Дата 8.6.2011, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 4
Всего: 85



Цитата(heavix @  8.6.2011,  01:34 Найти цитируемый пост)
fileName.Format(L"_FILE_TMP_%003d_",i + 1);
Стрёмный какой-то формат
Попробуйте
Код

fileName.Format(L"_FILE_TMP_%03d_",i + 1);

PM MAIL   Вверх
heavix
Дата 8.6.2011, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 10.8.2007

Репутация: нет
Всего: нет



Цитата
 
Попробуйте
Код

fileName.Format(L"_FILE_TMP_%03d_",i + 1);



согласен - мелкая опечатка)) но на суть вопроса совершенно никак не влияет) имя файла то корректно генерится...
PM MAIL   Вверх
volatile
Дата 8.6.2011, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 4
Всего: 85



Ну хорошо.
а чуть ниже path.Append
зачем добавляется каждый раз?

просто интуитивно -  здесь явно с именами что-то.

PM MAIL   Вверх
afiskon
Дата 8.6.2011, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: нет
Всего: 4



1. У вас память течет.
2. path.Append(fileName); в цикле - на второй итерации будет path/file1/file2 - потому и не создается
3. ... здесь еще много кода... - разбивайте код на функции!
PM MAIL WWW   Вверх
heavix
Дата 8.6.2011, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 10.8.2007

Репутация: нет
Всего: нет



Всем спасибо огромное))
добавил:
 
path.RemoveFileSpec(); - все работает...)))


Вопрос к 
afiskon, 

Цитата

1. У вас память течет.


А где?...




PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0494 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.