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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Резервное копирование, с возможностью обращения 
:(
    Опции темы
SGTeam
Дата 18.8.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



И так проблема - Обьявляю 2 глобальные переменные например p1 и р2 типа TFileStream.При открытии файла присваиваю первой переменной имя открываемого файла, второй- файла копии.Проблема - при попытке обратится в дальнейшем из какой либо другой части программы ко второй переменной выдаётся ошибка- занято другим процессом. Каким образом при открытии файла мне правильно его копировать, чтобы одновременно работать с 2 файлами сразу но в разных потоках.
PM MAIL   Вверх
dumb
Дата 18.8.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



вопрос кривоват. а ошибка в 17ой строке.
PM MAIL   Вверх
SGTeam
Дата 18.8.2006, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Упс...исправляюсь...
Код

private
  procedure SHAddToRecentDocs(Flags: Word; pfname: Pointer); stdcall; external 'shell32.dll' name'SHAddToRecentDocs'
      { Private declarations }
  public
    { Public declarations }
  end;
const
SHARD_PIDL = 1;
SHARD_PATH = 2;
var
  Form1: TForm1;
  BackupFile,OrigFile: TFileStream;
  BakFilePath,FilePath: String;
implementation



procedure TForm1.Open1Click(Sender: TObject);
var
str: String;
FileStr: TMemoryStream;
begin
FileStr:= TMemoryStream.Create;
if Opendlg.Execute then
begin
   Str := ExtractFileName(Opendlg.FileName);
   Str := ExtractFileName(str);
   HexEditor.LoadFromFile(Opendlg.FileName);
   FilePath:=OpenDlg.FileName;
   SHAddTorecentDocs(SHARD_PATH,pchar(Opendlg.FileName));
   Application.ProcessMessages;
end;
 FileStr.LoadFromFile(FilePath);
 if FileExists(Application.ExeName+str + '.bak')= false then
      begin
      FileStr.SaveToFile(Application.ExeName+str + '.bak');
      BakFilePath:= Application.ExeName + str + '.bak';
      FileStr.Free;

     end;

end;

procedure CheckFile;
var
  F1, F2: TFileStream;
  buf1, buf2: array[0..127] of Byte;
  i, size: Integer;
begin
  F1.Create(FilePath,fmOpenRead);
  F2.Create(BakFilePath,fmOpenRead);//вот тут лажа и начинается=(

PM MAIL   Вверх
Rennigth
Дата 18.8.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ну во первых не
Код

  F1.Create(FilePath,fmOpenRead);
  F2.Create(BakFilePath,fmOpenRead);//вот тут лажа и начинается=(

а
Код

  F1 := TFileStream.Create(FilePath,fmOpenRead);
  F2 := TFileStream.Create(BakFilePath,fmOpenRead);//вот тут лажа и начинается=(

smile 
PS: (сговорились чтоли... часто такие ошибки лезу последнее время)

так, ща смотрим дальше...



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


Эксперт
****


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

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



Код
  F1.Create(FilePath,fmOpenRead);
  F2.Create(BakFilePath,fmOpenRead);

Это где же тебя так классы учили создавать? Надо так:
Код
  f1 := TFileStream.Create('', fmOpenRead);
  f2 := TFileStream.Create('', fmOpenRead);


Добавлено @ 17:13 
Rennigth
smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
dumb
Дата 18.8.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



в OpenClick'е криво освобождается поток. значения путей задаются где-нибудь помимо этого опенклика? при открывании надо бы ловить ошибки.
PM MAIL   Вверх
Rennigth
Дата 18.8.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Yanis, smile

SGTeam,  что в итоге на за путь у тебя получается вот здесь:
Код

  F1 := TFileStream.Create(FilePath,fmOpenRead);
  F2 := TFileStream.Create(BakFilePath,fmOpenRead); //<<---

в BakFilePath?

Добавлено @ 17:21 
а то код неочень наглядный... гадать не очень хочется smile 


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


Новичок



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

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



BakFilePath - путь к копии файла
Код

 BakFilePath:= Application.ExeName + str + '.bak';

PM MAIL   Вверх
Guedda
Дата 19.8.2006, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


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

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



Хм... А если просто попробовать через CopyFIle, чтобы не заморачиваться???


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Akella
Дата 19.8.2006, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



это конечно не моё дело, но почему бы не использовать функции самой винды в командном файле
Цитата
xcopy D:\IP_Data\data2006\*.* D:\Archive\IP\DATA2006 /f /i /s /e /y /z

PM MAIL   Вверх
SGTeam
Дата 19.8.2006, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Через CopyFile получается - файл занят чужим процессом=(
PM MAIL   Вверх
Guedda
Дата 19.8.2006, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


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

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



А если в вместо fmOpenRead поставить fmShareDenyNone? 


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
SGTeam
Дата 19.8.2006, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пробовал - опять занято другим процессом.........Кроме открытия и процедуры сравнивания нигде более к тем файлам не обращаюсь.
PM MAIL   Вверх
dumb
Дата 19.8.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



приводи полный текст модуля.
PM MAIL   Вверх
SGTeam
Дата 19.8.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, Grids, MPHexEditor, MPHexEditorEx, Menus,StdCtrls,LZExpand;

type
  TForm1 = class(TForm)
    HexEditor: TMPHexEditorEx;
    StatusBar1: TStatusBar;
    MainMenu1: TMainMenu;
    File1: TMenuItem;
    About1: TMenuItem;
    Open1: TMenuItem;
    Save1: TMenuItem;
    Exit1: TMenuItem;
    About2: TMenuItem;
    OpenDlg: TOpenDialog;
    PopupMenu1: TPopupMenu;
    Cut1: TMenuItem;
    N1: TMenuItem;
    File2: TMenuItem;
    Open2: TMenuItem;
    Closewithnosave1: TMenuItem;
    Save2: TMenuItem;
    Exit2: TMenuItem;
    N2: TMenuItem;
    Search1: TMenuItem;
    Gotooffset1: TMenuItem;
    Compare1: TMenuItem;
    Copy1: TMenuItem;
    Paste1: TMenuItem;
    Cut2: TMenuItem;
    FindDialog1: TFindDialog;
    procedure Open1Click(Sender: TObject);
    procedure Save1Click(Sender: TObject);
    procedure Cut1Click(Sender: TObject);
    procedure Copy1Click(Sender: TObject);
    procedure Paste1Click(Sender: TObject);
    procedure Savepasted1Click(Sender: TObject);
    procedure Open2Click(Sender: TObject);
    procedure Closewithnosave1Click(Sender: TObject);
    procedure Save2Click(Sender: TObject);
    procedure Exit2Click(Sender: TObject);
    procedure Gotooffset1Click(Sender: TObject);
    procedure Compare1Click(Sender: TObject);


   
  private
      { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  BackupFile,OrigFile: TFileStream;
  BakFilePath,FilePath: String;
implementation

{$R *.dfm}
//**********************************LOGIC***************************************
function ExtractFileName(FileName: string): string;
var
 i: integer;
begin
Result:='';
for i:=Length(FileName) downto 1 do
 if FileName[i]='\' then
  break
 else
  Result:=FileName[i]+Result;
end;

function ExtractFileName2(FileName: string): string;
var
 i: integer;
begin
Result:='';
for i:=Length(FileName) downto 1 do
 if FileName[i]='.' then
  begin
  Result:=Copy(FileName, 1, i-1);
  break;
  end;
end;






//********************************INTERFACE*************************************


procedure TForm1.Open1Click(Sender: TObject);
var
str: String;
FileStr: TMemoryStream;
begin
FileStr:= TMemoryStream.Create;
if Opendlg.Execute then
begin
   Str := ExtractFileName(Opendlg.FileName);
   Str := ExtractFileName(str);
   HexEditor.LoadFromFile(Opendlg.FileName);
   FilePath:=OpenDlg.FileName;
   Application.ProcessMessages;
end;
 FileStr.LoadFromFile(FilePath);
 if FileExists(Application.ExeName+str + '.bak')= false then
      begin
      FileStr.SaveToFile(Application.ExeName+str + '.bak');
      BakFilePath:= Application.ExeName + str + '.bak';
      FileStr.Free;
     end;
end;

procedure TForm1.Save1Click(Sender: TObject);
begin
hexeditor.Save;
end;

procedure TForm1.Cut1Click(Sender: TObject);
begin
hexeditor.CBCut;
end;

procedure TForm1.Copy1Click(Sender: TObject);
begin
HexEditor.CBCopy;
end;

procedure TForm1.Paste1Click(Sender: TObject);
begin
HexEditor.CBPaste;
end;

procedure TForm1.Savepasted1Click(Sender: TObject);
var
S: TStringList;
Temp: TStream;
begin
S:=TSTringList.Create;
Temp:=TStream.Create;
HexEditor.CBCopy;


end;

procedure TForm1.Open2Click(Sender: TObject);
begin
Open1.Click;
end;

procedure TForm1.Closewithnosave1Click(Sender: TObject);
begin
//
end;

procedure TForm1.Save2Click(Sender: TObject);
begin
Save1.Click;
end;

procedure TForm1.Exit2Click(Sender: TObject);
begin
Form1.Destroy;
end;

procedure TForm1.Gotooffset1Click(Sender: TObject);
var
s,FileSeg: String;//inputing offset
i: integer;
begin
 FileSeg := InputBox('Insert offset value','0X00',S);
 HexEditor.Seek(StrToInt(FileSeg),i)
end;


procedure CheckFile;
var
  F1, F2: TFileStream;
  buf1, buf2: array[0..127] of Byte;
  i, size: Integer;
begin
  OrigFile.Create(FilePath,fmOpenRead);
  BackupFile.Create(BakFilePath,fmOpenRead);
  F1:=OrigFile;
  F2:=BackUpFile;
  if F2.Size<F1.Size then
  size:=F2.Size else
  size:=F1.Size;
  while F1.Position<size do
  begin
    F1.Read(buf1, 128);
    F2.Read(buf2, 128);
    for i:=0 to 127 do
    if buf1[i]<>buf2[i] then
    ShowMessage('Расхождения в ' + IntToStr(F1.Position-127+i) + ' байте.' +
      #10#13 + 'Произошла замена: ' + IntToStr(buf1[i]) + ' на '+
      IntToStr(buf2[i]));
  end;
  F1.Free;
  F2.Free;
end;
procedure TForm1.Compare1Click(Sender: TObject);
begin
CheckFile;
end;

end.


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.1768 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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