Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Гарантированное открытие файла 
:(
    Опции темы
ASGDeveloper
Дата 21.7.2006, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


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

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



Иногда при попытке открытия файла мы получаем алерт о невозможности открытия по причине того, что файл открыт другой прогой. Но если открывать в режиме только чтения, то иногда открываются и закрытые файлы. Мне хочется использовать метод, благодаря которому можно открыть любой закрытый файл и не получить по рукам (от системы) при открытие.

ЗЫ Может CreateFile поможет или есть другие варианты? 
PM MAIL   Вверх
Snowy
Дата 21.7.2006, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Если открывшая программа запретила расшаривание, то никак ты его не откроешь. 
PM MAIL   Вверх
BUGOR
Дата 21.7.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

ЗЫ Может CreateFile поможет или есть другие варианты? 


1. Поиск хэндла открытого файла.
2. Изменение прав доступа существующего хэндла.
3. Чтение файла с помощью прямого доступа к диску. 


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
Akella
Дата 21.7.2006, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



можно с помощью MemoryStream на чтение открыть даже уже открытый другогй программой файл 
PM MAIL   Вверх
ASGDeveloper
Дата 21.7.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


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

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



Цитата(Snowy @  21.7.2006,  12:03 Найти цитируемый пост)
Если открывшая программа запретила расшаривание, то никак ты его не откроешь.

Разве? Я понимаю системный файл (хотя можно открыть даже pagefile.sys но только частично). Вон Unlocker не только открывает, но и блок снимает. Или антивирусы. Они тоже заблокированные файлы открывать умеют.

Добавлено @ 12:15 
Цитата(Akella @  21.7.2006,  12:13 Найти цитируемый пост)
можно с помощью MemoryStream на чтение открыть даже уже открытый другогй программой файл  

Использование как FileStream?  smile  
PM MAIL   Вверх
Akella
Дата 21.7.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Код
var
//Этот способ никогда не открывает файл, а создаёт копию файла в памяти.
  Memory: TMemoryStream;
begin
  Memory := TMemoryStream.Create;
  try
    Memory.LoadFromFile('busyfile.dat');
    ..
    Memory.Read(...); // можно использовать методы чтения как у файлов
    Memory.Seek(...);
    FileSize := Memory.Size;
    ..
  finally
    Memory.Free;
  end;
end;


Код
var
  b: string[15];
begin
  with TFileStream.create('c:\MyFile.doc', fmShareDenyNone) do
  try
    read(b, 14);
    showmessage(b);
  finally
    Free;
  end;
end;


Код
procedure TForm1.Button1Click(Sender: TObject);
type
  AnyType = byte;
var
  F: file of AnyType;
const
  FName = 'D:/Exp.exe';
begin
  begin
    AssignFile(F, FName); { File selected in dialog }
    FileMode := fmOpenRead;
    Reset(F);
    // ...
    // ...
    CloseFile(F);
    FileMode := fmOpenReadWrite;
  end;
end;
 
PM MAIL   Вверх
ASGDeveloper
Дата 21.7.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


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

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



Цитата(Akella @  21.7.2006,  12:16 Найти цитируемый пост)
//Этот способ никогда не открывает файл, а создаёт копию файла в памяти.

Ммм... А если файл в 200 метров? Все в оперативу или он его маппирует? 
PM MAIL   Вверх
Akella
Дата 21.7.2006, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



да, это недостаток при работе с большыми файлами - будет работать медленно, но небоись, винда умная, знает, что делать  

Это сообщение отредактировал(а) Akella - 21.7.2006, 12:34
PM MAIL   Вверх
ASGDeveloper
Дата 21.7.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


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

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



Цитата(Akella @  21.7.2006,  12:34 Найти цитируемый пост)
будет работать медленно

Спрашивать "насколько медленно" не буду.   smile 
Щас сам проверю. Короче спасибо за помощь.

ЗЫ +1  smile  
PM MAIL   Вверх
Rennigth
Дата 21.7.2006, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

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



Akella, 
извини, но ни один из твоих вариантов не отработает...  smile 
Хоть MemoryStream, хоть FileStream...
PS: кстати, код LoadFromFile MemoryStream
Код

  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
  


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Alexeis
Дата 21.7.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Akella, не с tmemorystream не работает
Этот код блокирует
Код

var
  f : TFileStream;

procedure TForm1.FormCreate(Sender: TObject);
var
   
   i : Integer;
begin
 f := TFileStream.Create('c:\1.txt', fmCreate or fmShareDenyNone);
 for i := 1 to 100
 do
   f.WriteBuffer(i, SizeOf(i));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 f.Free;
end;


А этот (второе приложение) не может открыть и вызывает ошибку!
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  Memory: TMemoryStream;
  f : TFilestream;
begin
  Memory := TMemoryStream.Create;
  f := TFilestream.Create('c:\2.txt', fmcreate);
  try
    Memory.LoadFromFile('c:\1.txt');
    f.CopyFrom(Memory, Memory.Size);
  finally
    Memory.Free;
    f.Free
  end;
end;
 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ASGDeveloper
Дата 21.7.2006, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


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

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



Мдя. Фигово. Значит пробовать как здесь?
http://forum.vingrad.ru/index.php?act=ST&a...05000&st=0#  smile  
PM MAIL   Вверх
BUGOR
Дата 21.7.2006, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не пойму, привёз название 3х методов, 3ий так вообще даёт доступ к любому файлу, хоть к занятому системными службами, хоть к драйверам, к любым, а вы тут спорите понятно вообще о чём... достаточно было открыть яндекс, вбить в строку поиска любое название из трёх и сразу же бы попали на статью с примерами и подробным описанием.  


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
ASGDeveloper
Дата 21.7.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


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

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



Цитата(BUGOR @  21.7.2006,  15:28 Найти цитируемый пост)
достаточно было открыть яндекс

Или васм.  smile 
http://www.wasm.ru/article.php?article=lockfileswork

Кстати, если открыть яндекс, то результаты будут весьма мелкими.  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




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


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

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