Перейти к содержимому

Фото
- - - - -

C++ работа с файлами


  • Вы не можете создать новую тему
  • Please log in to reply
12 ответов в этой теме

#1 SmokEr

SmokEr
  • Пользователь
  • 119 сообщений

Отправлено 01 декабря 2008 - 17:25

Попробую как можно более доходчиво объяснить суть проблемы.

Есть программа на С, которая должна работать сутки и более.
В процессе выполнения, время от времени (где-то раз в 10 минут) она будет запускать файл "filename.exe", который в свою очередь будет использовать несколько конфигурационных файлов. Так вот, вопрос в том, как исключить возможность замены этих конфигурационных файлов (допустим криворукий пользователь решит, что можно конфигурационные файлы менять "на лету") с целью избежания непредсказуемых результатов.
Я вижу один вариант:

ifstream f1, f2, f3, fn;
f1.open(cfg1);
f2.open(cfg2);
f3.open(cfg3);
.....
fn.open(cfgn);

while(program executing)
{
	do something
}
f1.close(cfg1);
f2.close(cfg2);
f3.close(cfg3);
.....
fn.close(cfgn);
Можно ли решить этот вопрос какнить изящнее, или просто держать файлы открытыми - это единственно верное решение?
  • 0

#2 Warvick

Warvick
  • Пользователь
  • 411 сообщений
  • Откуда:Tallinn

Отправлено 01 декабря 2008 - 20:57

ммм. По идее при открытии файла можно указать exclusive lock.
А вообще это зависит от оси. Ты под win или *nix ?
  • 0
Да, я такой!

#3 SmokEr

SmokEr
  • Пользователь
  • 119 сообщений

Отправлено 02 декабря 2008 - 02:04

Warvick, win
  • 0

#4 Warvick

Warvick
  • Пользователь
  • 411 сообщений
  • Откуда:Tallinn

Отправлено 02 декабря 2008 - 09:42

http://msdn.microsof...y/aa365202.aspx
  • 0
Да, я такой!

#5 Zero

Zero

    TRUST NO ONE

  • Постоялец
  • 10 668 сообщений
  • Откуда:Таллин

Отправлено 02 декабря 2008 - 19:36

или просто держать файлы открытыми - это единственно верное решение?

Если они открываются как shared, то и это не поможет.
  • 0
Моя Родина - СССР! Пролетарии всех стран, соединяйтесь!
-----------------------------------------------------------------------
Ясность - одна из форм полного тумана. Форумчане, давайте жить дружно!

#6 Dimm0n

Dimm0n

    Искатель

  • Пользователь
  • 214 сообщений
  • Откуда:Таллинн/Тарту

Отправлено 03 декабря 2008 - 11:31

По идее - держать открытыми как НЕ_SHARED. Хотя есть мнение, что находчивый криворукий пользователь всё равно сможет их повредить :)

И да, если файлы использует только filename.exe... То кто же будет держать файлы открытыми? :) Если основное приложение, то filename.exe не сможет к ним обратиться, если они открыты не в режиме shared. А если в режиме shared - смотри выше :)
  • 0
Стояли звери около двери,
В них стреляли, они умирали...

#7 zedirtybastard

zedirtybastard
  • Пользователь
  • 499 сообщений

Отправлено 03 декабря 2008 - 12:01

IMHO записывай в память чексум от конфигов в память и каждый раз при открытии проверяй, совпадает или нет.
В таком случае тебе в памяти не надо будет держать файло, а только MD5 или CRC32 от него.

Сообщение изменено: zedirtybastard (03 декабря 2008 - 12:07 )

  • 0

#8 Slash

Slash
  • Пользователь
  • 78 сообщений
  • Откуда:Estonia - Tallinn

Отправлено 03 декабря 2008 - 16:43

Отчего бы не держать данные конфигов в памяти основной проги, затем перезаписывать их, что бы там ни было перед запуском "filename.exe", а по завершении, снова зачитывать их в память?
  • 0

#9 SmokEr

SmokEr
  • Пользователь
  • 119 сообщений

Отправлено 04 декабря 2008 - 13:05

IMHO записывай в память чексум от конфигов в память и каждый раз при открытии проверяй, совпадает или нет.
В таком случае тебе в памяти не надо будет держать файло, а только MD5 или CRC32 от него.


zedirtybastard, В общем я так и сделал, просто думал, мало ли можно замену как-то предотвратить.

Сообщение изменено: SmokEr (05 декабря 2008 - 10:50 )

  • 0

#10 Slash

Slash
  • Пользователь
  • 78 сообщений
  • Откуда:Estonia - Tallinn

Отправлено 05 декабря 2008 - 17:24

Эмм... А что даст запоминание чексама? Это только поможет вовремя отловить ошибку, а конфиги восстановить не удастся. Запомнив просто куском бинарных данных файлы конфигов в основной проге и восстанавливая их когда требуется, эта проблема сразу решается.
  • 0

#11 SmokEr

SmokEr
  • Пользователь
  • 119 сообщений

Отправлено 06 декабря 2008 - 16:07

Slash, Задача номер 1 - знать наверняка, в чём была ошибка. А твоё предложение интересно, можно будет попробовать, вот только зачем нужен следующий пункт:

а по завершении, снова зачитывать их в память

Если достаточно один раз прочитать, а потом просто писать перед вызовом "filename.exe".
  • 0

#12 Zero

Zero

    TRUST NO ONE

  • Постоялец
  • 10 668 сообщений
  • Откуда:Таллин

Отправлено 06 декабря 2008 - 20:33

IMHO записывай в память чексум от конфигов в память и каждый раз при открытии проверяй, совпадает или нет.
В таком случае тебе в памяти не надо будет держать файло, а только MD5 или CRC32 от него.

Тут опять дружно вспоминаем проблему гонок и состязаний. Она будет. Хотя, если целиком считывать в память и потом проверять...
  • 0
Моя Родина - СССР! Пролетарии всех стран, соединяйтесь!
-----------------------------------------------------------------------
Ясность - одна из форм полного тумана. Форумчане, давайте жить дружно!

#13 Slash

Slash
  • Пользователь
  • 78 сообщений
  • Откуда:Estonia - Tallinn

Отправлено 07 декабря 2008 - 02:55

Slash, Задача номер 1 - знать наверняка, в чём была ошибка. А твоё предложение интересно, можно будет попробовать, вот только зачем нужен следующий пункт:

Если достаточно один раз прочитать, а потом просто писать перед вызовом "filename.exe".

Ааа, ну если конфиг статический и не изменяется дочерней программой то да :)
  • 0