бросить исключение при создании уже существующего файла
От: pivoo Россия  
Дата: 25.10.04 08:28
Оценка:
поведение нескольких прогамм зависит от наличия определенного
файла : они должны выполнять какие-то действия если файл
отсутствует (в т.ч. создать этот файл).
Проверять наличие файла чем-нить типа boost::filessystems::exists()
нельзя, так как за время между вызовом exists
и созданием файла файл уже может быть создан другой программой.

Как сделать так что бы при создании файла, если он уже существует,
бросалось бы исключение или че-нить такое ?
Re: бросить исключение при создании уже существующего файла
От: ssm Россия  
Дата: 25.10.04 10:26
Оценка:
Здравствуйте, pivoo, Вы писали:


P>Как сделать так что бы при создании файла, если он уже существует,

P>бросалось бы исключение или че-нить такое ?

а чем ты создаешь файл?
Re[2]: бросить исключение при создании уже существующего фай
От: pivoo Россия  
Дата: 25.10.04 10:33
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>а чем ты создаешь файл?


мне не важно чем создавать, главное платформонезависимо,
а файл этот важен только фактом своего существования.

в данный момент ofstream'ом
Re[3]: бросить исключение при создании уже существующего фай
От: pivoo Россия  
Дата: 25.10.04 10:47
Оценка:
Здравствуйте, pivoo, Вы писали:

P>Здравствуйте, ssm, Вы писали:


ssm>>а чем ты создаешь файл?


P>мне не важно чем создавать, главное платформонезависимо,

P>а файл этот важен только фактом своего существования.

P>в данный момент ofstream'ом


блин а exception он вобще кидать не хочет,
открываю 2 потока, связанных с одним и тем же файлом
и пишу в них, никаких exception'ов но в файле
одни данные поверх других.
Re[4]: бросить исключение при создании уже существующего фай
От: _nn_ www.nemerleweb.com
Дата: 25.10.04 10:53
Оценка:
Здравствуйте, pivoo, Вы писали:

P>Здравствуйте, pivoo, Вы писали:


P>>Здравствуйте, ssm, Вы писали:


ssm>>>а чем ты создаешь файл?


P>>мне не важно чем создавать, главное платформонезависимо,

P>>а файл этот важен только фактом своего существования.

P>>в данный момент ofstream'ом


P>блин а exception он вобще кидать не хочет,

P>открываю 2 потока, связанных с одним и тем же файлом
P>и пишу в них, никаких exception'ов но в файле
P>одни данные поверх других.
Действия потоков синхронизировать нужно, однако
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: бросить исключение при создании уже существующего фай
От: ssm Россия  
Дата: 25.10.04 11:38
Оценка:
Здравствуйте, pivoo, Вы писали:

P>Здравствуйте, pivoo, Вы писали:


P>>Здравствуйте, ssm, Вы писали:


ssm>>>а чем ты создаешь файл?


P>>мне не важно чем создавать, главное платформонезависимо,

P>>а файл этот важен только фактом своего существования.

P>>в данный момент ofstream'ом


P>блин а exception он вобще кидать не хочет,

P>открываю 2 потока, связанных с одним и тем же файлом
P>и пишу в них, никаких exception'ов но в файле
P>одни данные поверх других.

два потока и два процесса — это две разные вещи, если у тебя два потока, то тебе хватит одной критической секции, если у тебя два процесса, то я бы сделал менеджер записи в файл, который бы был singleton, в отношении твоих процессов, и всю работу с файлами производил при помощи этого мэнеджера.
но тут другой вопрос возникает : а где ты возьмешь критическую секцию для голого C++?
я думаю, тебе стоит написать кусок платформо-зависимого кода, для определения занятости файла и блокировок. будет имхо проще
Re[5]: бросить исключение при создании уже существующего фай
От: pivoo Россия  
Дата: 26.10.04 07:55
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>два потока и два процесса — это две разные вещи, если у тебя два потока, то тебе хватит одной критической секции, если у тебя два процесса, то я бы сделал менеджер записи в файл, который бы был singleton, в отношении твоих процессов, и всю работу с файлами производил при помощи этого мэнеджера.

ssm>но тут другой вопрос возникает : а где ты возьмешь критическую секцию для голого C++?
ssm>я думаю, тебе стоит написать кусок платформо-зависимого кода, для определения занятости файла и блокировок. будет имхо проще

неужели нет такой штуки, что при попытке создать
уже существующий файл
происходило бы что-нибудь плохое ???
это же кажется достаточно естественным ...
Re[6]: бросить исключение при создании уже существующего фай
От: ssm Россия  
Дата: 26.10.04 08:14
Оценка:
Здравствуйте, pivoo, Вы писали:



P>неужели нет такой штуки, что при попытке создать

P>уже существующий файл
происходило бы что-нибудь плохое ???
P>это же кажется достаточно естественным ...
ну почему нет?


#ifdef WIN32

  HANDLE handle = ::CreateFile( 
    fileName, 
    FILE_ALL_ACCESS, 
    FILE_SHARE_READ, 
    0, 
    CREATE_NEW, 
    FILE_ATTRIBUTE_NORMAL, 
    0);

  if(INVALID_HANDLE_VALUE == handle)
    throw EFileExist(fileName);
  else
  {
     return new WinFile(handle);
  }  

#endif //WIN32
Re[7]: бросить исключение при создании уже существующего фай
От: pivoo Россия  
Дата: 26.10.04 08:41
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>
ssm>#ifdef WIN32

ssm>  HANDLE handle = ::CreateFile( 
ssm>    fileName, 
ssm>    FILE_ALL_ACCESS, 
ssm>    FILE_SHARE_READ, 
ssm>    0, 
ssm>    CREATE_NEW, 
ssm>    FILE_ATTRIBUTE_NORMAL, 
ssm>    0);

ssm>  if(INVALID_HANDLE_VALUE == handle)
ssm>    throw EFileExist(fileName);
ssm>  else
ssm>  {
ssm>     return new WinFile(handle);
ssm>  }  

ssm>#endif //WIN32
ssm>


а можно тогда поподробнее какие инклуды нужны,
и что за функция WinFile ? (да и все остальные )
Re[8]: бросить исключение при создании уже существующего фай
От: ssm Россия  
Дата: 26.10.04 09:10
Оценка: 2 (1)
Здравствуйте, pivoo, Вы писали:


P>а можно тогда поподробнее какие инклуды нужны,

P>и что за функция WinFile ? (да и все остальные )




#include <windows.h>

class EFileExist : public std::exception
{
//...
};

struct IAbstractFile
{
public:
  virtual void seek(...);
  virtual void read(...);
  //...
};

class WinFile : public IAbstractFile
{
public:
  WinFile(HANDLE fileHandle);
  ...
};
Re: в качестве резюме
От: pivoo Россия  
Дата: 26.10.04 11:51
Оценка:
Короче, в unix есть
int open(const char* path, int access_mode, mode_t permision);

возвращает дескриптор файла
если в access_mode загнать
O_CREAT | O_EXCL , то

Если установлены флаги O_CREAT и O_EXCL, а указанный файл уже существует,
выполнение функции open завершится неудачей


дли виндовсов найдена аналогичная функция
int _open(
   const char *filename,
   int oflag [,
   int pmode] 
);

см. МСДН
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.