Avatar billede rekun Nybegynder
11. marts 2007 - 12:21 Der er 7 kommentarer og
1 løsning

Kopire fil hvis der ikke trykkes på tastaturet

Er det muligt at lave en slags
If keydown then
ved godt det ikke hedder keydown, men jeg skal en procedure, som kopire en fil, hvis der IKKE trykkes på tastaturet.

Problemet er, at jeg har et program, som gemmer alle tastetryk i en fil, og den skal så gemmes kopires til en usb stick. Men den giver en fejl hvis den skal kopire fil, og den bliver skrevet til samtidig.

fejlen er "processen kan ikke få adgang til filen, da den bruges af en anden proces"
Avatar billede scorpe Nybegynder
11. marts 2007 - 12:52 #1
Prøv at skrive en smugle kode ...
Avatar billede rekun Nybegynder
11. marts 2007 - 17:35 #2
procedure TForm1.Timer1Timer(Sender: TObject);

//kopire fil
CopyFile(PChar('C:\fil.txt),PChar(Fil.txt),true);

det er alt hvad jeg har. Filen som skal kopires, er IKKE lavet i det samme program.
Avatar billede dkn Nybegynder
12. marts 2007 - 02:13 #3
nu ved jeg ikke hvor stor den fil er. Men du kunne måske loade den ind i memorystream og så gemme den hvor du har lyst derfra.

fx

var
ms:tmemorystream;
begin
ms:=tmemorystream.create;
try
ms.loadfromfile('C:\fil.txt');
ms.savetofile('C:\kopi.txt');
finally
ms.free;
end;
end;
Avatar billede a_nor Nybegynder
12. marts 2007 - 09:15 #4
Kan du fra kommandopromptet kopiere filen med copy ?? og hvad med delete?

Filen kan af det andet program være åbnet i en mode så du ikke får adgang til den eller en eller flere regioner kan være blokeret for adgang. Hvis copy kan læse filen skal dit program åbne filen i en "delt adgangs" mode for at du kan få lov.

Følgende er kopieret fra Hjælpen i D3:

SysUtils

Category

File Management Routines
FileOpen opens a specified file using the specified access mode.

function FileOpen(const FileName: string; Mode: Integer): Integer;

Description

The access mode value is constructed by OR-ing one of the fmOpen constants with one of the fmShare constants defined by the File open mode constants. If the return value is positive, the function was successful and the value is the file handle of the opened file. A return value of -1 indicates that an error occurred.

Example

procedure OpenForShare(const FileName: String);

var
  FileHandle : Integer;
begin
  FileHandle := FileOpen(FileName, fmOpenWrite or fmShareDenyNone);
  if FileHandle > 0 then
    [valid file handle}
  else
    [Open error: FileHandle = negative DOS error code]
end;

Note

Use of the non-native Pascal file variable handlers such as FileOpen is discouraged. These routines map to the Windows API functions and return file handles, not normal Pascal file variables. These are low-level file access routines. For normal file operations use the normal AssignFile, Rewrite, Reset operations instead of FileOpen.

i SysUtils er følgende muligheder anført:

{ File open modes }

  fmOpenRead      = $0000;
  fmOpenWrite      = $0001;
  fmOpenReadWrite  = $0002;
  fmShareCompat    = $0000;
  fmShareExclusive = $0010;
  fmShareDenyWrite = $0020;
  fmShareDenyRead  = $0030;
  fmShareDenyNone  = $0040;

Når du har åbnet filen "passende" kan du nok blockreade fra den og så skrive til din egen fil med blockwrite
Avatar billede hrc Mester
12. marts 2007 - 22:38 #5
Er det ikke noget med at hægte en procedure på Application.OnIdle, bruge en TFileStream (istedet a_nor's forslag) og så fyre en FlushBuffer af første gang OnIdle blev kaldt efter et tastetryk?

OnKeyPressed:
  fFileStream.Add(@Key,sizeof(char));
  fKeyPressed := true;

OnIdle:
  if fKeyPressed then
  begin
    fFileStream.FlushBuffer;
    fKeyPressed := false;
  end;

... Eller endnu bedre at køre det gennem en tråd så det er helt transparent.
Avatar billede hrc Mester
12. marts 2007 - 22:38 #6
Hvad skal du i øvrigt med en keyLogger?
Avatar billede a_nor Nybegynder
13. marts 2007 - 11:13 #7
hrc: Jeg havde nu fornemmelsen af at gemningen i første omgang skete fra et andet program. Hvis ikke dette er tilfældet er mit indlæg selvfølgelig ikke relevant. Så skal filen vel bare closes inden kopiering ?
Avatar billede rekun Nybegynder
14. marts 2007 - 15:26 #8
hmm, jeg synes hrc's mulighed virker som den enkleste, og den virker, så hvis du smider et svar får du dine point
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester