Rotinas para Manipulação de Arquivos

 

                Nesse artigo, demonstro para vocês como uma biblioteca padrão de manipulação de arquivos pode ser criado para que você e sua equipe, não necessitem reinventar a roda a todo momento. Ou seja rotinas que possuem processos repetitivos podem ser morosos e ainda permitir erros por parte do desenvolvedor, que com o passar do tempo tem que administrar milhares de linhas de código.

 

                Por essa razão esse artigo é o primeiro de uma pequena série que permitirá termos uma visão de algumas rotinas que podem nos ajudar:

               

·         Tratamento de arquivos(este artigo);

·         Operações com DisksDrives;

·         Operações de Hardware;

·         Operações com Mouse;

·         Operações com o Sistema;

·         Operações com Strings;

 

Creio que com essas rotinas, padronizadas, vão servir de uma boa base para proteger e manter o seu sistema de maneira harmoniosa com sua equipe.

 

Várias vezes necessitamos ter rotinas de tratamento de arquivos, principalmente quando importamos dados de outros programas, de terceiros, ou até mesmo para proteger documentos, arquivos e nosso projeto.

 

Então.. mãos na massa. Crie um arquivo e dê o nome de “Arquivos”, no seu Delphi.

 

1: unit Arquivos;

2:

3: interface

4:

5: uses

6: Windows, Dialogs, Messages, SysUtils, Classes, Controls, StdCtrls,FileCtrl,

7: Graphics, shellapi, Printers;

8:

9:

10: function fileSize(const FileName: String): LongInt;

11: function GetFileDate(TheFileName: string): string;

12: function FileDate(Arquivo: String): String;

13: function FillDir(Const AMask: string): TStringList;

14: function WinExecAndWait32(FileName:String; Visibility : integer):integer;

15: Function RecycleBin(sFileName : string ) : boolean;

16: function NumLinhasArq(Arqtexto:String): integer;

17: function FileCopy(source,dest: String): Boolean;

18: function ExtractName(const Filename: String): String;

19: function FileTypeName(const aFile: String): String;

20: Procedure CopyFile( Const sourcefilename, targetfilename: String );

21: Procedure ZapFiles(vMasc:String);

22: function PrintImage(Origem: String):Boolean;

23:

24: implementation

25:

26: function fileSize(const FileName: String): LongInt;

27: {Retorna o tamanho de um arquivo}

28: var

29: SearchRec : TSearchRec;

30: begin { !Win32! -> GetFileSize }

31: if FindFirst(FileName,faAnyFile,SearchRec)=0

32: then Result:=SearchRec.Size

33: else Result:=0;

34: FindClose(SearchRec);

35: end;

36:

37:

38: function GetFileDate(TheFileName: string): string;

39: var

40: FHandle: integer;

41: begin

42: FHandle := FileOpen(TheFileName, 0);

43: result := DateToStr((FileDateToDateTime(FileGetDate(FHandle))));

44: FileClose(FHandle);

45: end;

46:

47:

48: function FileDate(Arquivo: String): String;

49: {Retorna a data e a hora de um arquivo}

50: var

51: FHandle: integer;

52: begin

53: if not fileexists(Arquivo) then

54: begin

55: Result := 'Nome de Arquivo Inválido';

56: end

57: else

58: begin

59: FHandle := FileOpen(Arquivo, 0);

60: try

61: Result := DateTimeToStr(FileDateToDateTime(FileGetDate(FHandle)));

62: finally

63: FileClose(FHandle);

64: end;

65: end;

66: end;

67:

68:

69: Procedure ZapFiles(vMasc:String);

70: {Apaga arquivos usando mascaras tipo: *.zip, *.* }

71: Var Dir : TsearchRec;

Unit1.pas 09/06/2010 18:37:20 Page 2 of 4

72: Erro: Integer;

73: Begin

74: Erro := FindFirst(vMasc,faArchive,Dir);

75: While Erro = 0 do Begin

76: DeleteFile( ExtractFilePAth(vMasc)+Dir.Name );

77: Erro := FindNext(Dir);

78: End;

79: FindClose(Dir);

80: End;

81:

82:

83: function FillDir(Const AMask: string): TStringList;

84: {Retorna uma TStringlist de todos os arquivos localizados

85: no path corrente , Esta função trabalha com mascaras}

86: var

87: SearchRec : TSearchRec;

88: intControl : integer;

89: begin

90: Result := TStringList.create;

91: intControl := FindFirst( AMask, faAnyFile, SearchRec );

92: if intControl = 0 then

93: begin

94: while (intControl = 0) do

95: begin

96: Result.Add( SearchRec.Name );

97: intControl := FindNext( SearchRec );

98: end;

99: FindClose( SearchRec );

100: end;

101: end;

102:

103:

104: function WinExecAndWait32(FileName:String; Visibility : integer):integer;

105: { Tenta executar o aplicativo finalizando-o corretamente apos o uso. Retorna -1 em caso de falha}

106: var

107: zAppName:array[0..512] of char;

108: zCurDir:array[0..255] of char;

109: WorkDir:String;

110: StartupInfo:TStartupInfo;

111: ProcessInfo:TProcessInformation;

112: begin

113: StrPCopy(zAppName,FileName);

114: GetDir(0,WorkDir);

115: StrPCopy(zCurDir,WorkDir);

116: FillChar(StartupInfo,Sizeof(StartupInfo),#0);

117: StartupInfo.cb := Sizeof(StartupInfo);

118: StartupInfo.dwFlags := STARTF_USESHOWWINDOW;

119: StartupInfo.wShowWindow := Visibility;

120: if not CreateProcess(nil,zAppName,nil,nil,false,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,

121: begin

122: Result := -1;

123: end

124: else

125: begin

126: WaitforSingleObject(ProcessInfo.hProcess,INFINITE);

127: GetExitCodeProcess(ProcessInfo.hProcess,Result);

128: end;

129: end;

130:

131:

132: Function RecycleBin(sFileName : string ) : boolean;

133: // Envia um arquivo para a lixeira ( requer a unit Shellapi.pas)

134: var

135: fos : TSHFileOpStruct;

136: Begin

137: FillChar( fos, SizeOf( fos ), 0 );

138: With fos do

139: begin

140: wFunc := FO_DELETE;

141: pFrom := PChar( sFileName );

142: fFlags := FOF_ALLOWUNDO

Unit1.pas 09/06/2010 18:37:20 Page 3 of 4

143: or FOF_NOCONFIRMATION

144: or FOF_SILENT;

145: end;

146: Result := (0 = ShFileOperation(fos));

147: end;

148:

149: function NumLinhasArq(Arqtexto:String): integer;

150: // Retorna o número de linhas que um arquivo possui

151: Var

152: f: Textfile;

153: linha, cont:integer;

154: Begin

155: linha := 0;

156: cont := 0;

157: AssignFile(f,Arqtexto);

158: Reset(f);

159: While not eof(f) Do

160: begin

161: ReadLn(f);

162: Cont := Cont + 1;

163: end;

164: Closefile(f);

165: result := cont;

166: end;

167:

168:

169: function FileCopy(source,dest: String): Boolean;

170: {copia um arquivo de um lugar para outro. Retornando falso em caso de erro}

171: var

172: fSrc,fDst,len: Integer;

173: size: Longint;

174: buffer: packed array [0..2047] of Byte;

175: begin

176: if source <> dest then

177: begin

178: fSrc := FileOpen(source,fmOpenRead);

179: if fSrc >= 0 then

180: begin

181: size := FileSeek(fSrc,0,2);

182: FileSeek(fSrc,0,0);

183: fDst := FileCreate(dest);

184: if fDst >= 0 then

185: begin

186: while size > 0 do

187: begin

188: len := FileRead(fSrc,buffer,sizeof(buffer));

189: FileWrite(fDst,buffer,len);

190: size := size - len;

191: end;

192: FileSetDate(fDst,FileGetDate(fSrc));

193: FileClose(fDst);

194: FileSetAttr(dest,FileGetAttr(source));

195: Result := True;

196: end

197: else

198: begin

199: Result := False;

200: end;

201: FileClose(fSrc);

202: end;

203: end;

204: end;

205:

206:

207: Procedure CopyFile( Const sourcefilename, targetfilename: String );

208: {Copia um arquivo de um lugar para outro}

209: Var

210: S, T: TFileStream;

211: Begin

212: S := TFileStream.Create( sourcefilename, fmOpenRead );

213: try

Unit1.pas 09/06/2010 18:37:20 Page 4 of 4

214: T := TFileStream.Create( targetfilename, fmOpenWrite or fmCreate );

215: try

216: T.CopyFrom(S, S.Size ) ;

217: finally

218: T.Free;

219: end;

220: finally

221: S.Free;

222: end;

223: end;

224:

225:

226: function ExtractName(const Filename: String): String;

227: {Retorna o nome do Arquivo sem extensão}

228: var

229: aExt : String;

230: aPos : Integer;

231: begin

232: aExt := ExtractFileExt(Filename);

233: Result := ExtractFileName(Filename);

234: if aExt <> '' then

235: begin

236: aPos := Pos(aExt,Result);

237: if aPos > 0 then

238: begin

239: Delete(Result,aPos,Length(aExt));

240: end;

241: end;

242: end;

243:

244:

245: function FileTypeName(const aFile: String): String;

246: {Retorna descrição do tipo do arquivo. Requer a unit ShellApi}

247: var

248: aInfo: TSHFileInfo;

249: begin

250: if SHGetFileInfo(PChar(aFile),0,aInfo,Sizeof(aInfo),SHGFI_TYPENAME)<>0 then

251: Result := StrPas(aInfo.szTypeName)

252: else begin

253: Result := ExtractFileExt(aFile);

254: Delete(Result,1,1);

255: Result := Result +' File';

256: end;

257: end;

258:

259:

260: function PrintImage(Origem: String):Boolean;

261: // imprime um bitmap selecionado retornando falso em caso negativo

262: // requer as units Graphics e printers declaradas na clausula Uses

263: var

264: Imagem: TBitmap;

265: begin

266: if fileExists(Origem) then

267: begin

268: Imagem := TBitmap.Create;

269: Imagem.LoadFromFile(Origem);

270: with Printer do

271: begin

272: BeginDoc;

273: Canvas.Draw((PageWidth - Imagem.Width) div 2,(PageHeight - Imagem.Height) div 2,Imagem);

274: EndDoc;

275: end;

276: Imagem.Free;

277: Result := True;

278: end

279: else

280: begin

281: Result := False;

282: end;

283: end;

284:

285: end.

286:

287:

Pronto pessoal!, Biblioteca de funções de arquivo, concluída.

Até a próxima. Abraços++