Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2011, 19:05   #1
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию несколько позиций файла(мультиоткрытие)

можно ли как то открыть файл в одной программе два раза сразу?
(получив разные хендлы, с разными позициями соответственно)
иль хотелось бы еще проще, по одному хендлу сделать оное, возможно ли такое иль писать свой класс для работы таким образом?

цель, дать нескольким потокам возможность работать с одним файлов одновременно(каждому потоку нужна своя позиция в файле)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.03.2011, 20:04   #2
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Хендл можно дублировать, но позиция указателя в файле разумеется для всех дублированных хендлов всем потокам и процессам будет одинаковой; также и для одного и того же хендла позиция не может быть разной никак.
Чтобы разрешить открывать файл повторно посмотрите там в аргументах функции КреатФайл есть отвечающие как раз за это, откройте файл повторно и сделайте как вам надо
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 30.03.2011, 20:23   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> цель, дать нескольким потокам возможность работать с одним файлов одновременно(каждому потоку нужна своя позиция в файле)

элементарно, через OVERLAPPED:

Код:
var
  OL: POVERLAPPED;
  ofs: unsigned; // 32 or 64 bit offset
begin
    // тут находим/создаём свободный OL
    //
    if (nil <> OL) then begin
      //
      OL.Offset := ofs and $FFFFFFFF;
      {$IFDEF CPU64 }
      OL.OffsetHigh := ofs shr 32;
      {$ELSE }
      OL.OffsetHigh := 0;
      {$ENDIF CPU64 }
      //
      result := WriteFile(handle, g_logOLBufs[i], len, nil, OL);
      if (not result and (ERROR_IO_PENDING = GetLastError())) then
	result := true	// report no error
      else
	SetEvent(OL.hEvent);
      //
    end;
end;
g_logOLBufs — массив буферов (для каждого OL свой буфер).
Только файл handle должен быть открыт с флагом OVERLAPPED.

Любой поток в любой момент времени может вызвать это процедуру, запросив запись в любое место файла. Я так лог пишу. Если нуно, могу весь код привести, там не так много.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 30.03.2011, 20:43   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

А CreateFileMapping + MapViewOfFile не спасут ОРД ?
mss вне форума Ответить с цитированием
Старый 30.03.2011, 20:47   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Только хотел про файлмапинг добавить )

Если размер файла особо не не меняется, можно замапить его в память (CreateFileMapping(), MapViewOfFile()), и работать с файлом как с обычной памятью. В конце только не забыть flush() сделать. Там вобще всё просто получается. Для произвольного доступа (чтение/запись) самое оно.

Только если файл постоянно растёт, там есть тонкости. Или нет?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 02.04.2011, 15:27   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

хотя вариант мапинга + традиционный WriteFile(файл состоит из readonly данных, и так сказать оверлея(который уже RW))
можно же так?(просто пока не могу проверить...другим пока занят по горло)

а всетаки наверно для повышения производительности уже обработанные файлы буду грузить именно так.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
скачивание одного и того же файла несколько раз. Miha1986 Работа с сетью в Delphi 1 16.01.2011 21:36
Загрузка файла в несколько потоков Joe_Tribbiani Работа с сетью в Delphi 12 11.04.2009 12:06
Считать из файла несколько массивов pascalC Общие вопросы C/C++ 13 20.10.2008 21:16
Разделение txt файла на несколько htm Tiger16 Фриланс 3 17.04.2008 22:40
по нажатию кнопки shape будет сдвигаться на несколько позиций в сторону (Delphi7) -HunteR- Gamedev - cоздание игр: Unity, OpenGL, DirectX 14 12.11.2007 20:37