Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

127 wiersze
5.2 KiB

  1. unit uutlSerialization;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils;
  6. type
  7. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  8. IutlFileReader = interface
  9. ['{3A9C3AE3-CAEE-44C9-85BE-0BCAA5C1BE7A}']
  10. function LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  11. end;
  12. IutlFileWriter = interface
  13. ['{3DF84644-9FC4-4A8A-88C2-73F13E72B1ED}']
  14. procedure SaveStream(const aFilename: String; const aStream: TStream);
  15. end;
  16. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  17. TutlSimpleFileReader = class(TInterfacedObject, IutlFileReader)
  18. public
  19. function LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  20. end;
  21. TutlSimpleFileWriter = class(TInterfacedObject, IutlFileWriter)
  22. public
  23. procedure SaveStream(const aFilename: String; const aStream: TStream);
  24. end;
  25. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  26. TutlFileReaderProxy = class(TInterfacedObject, IutlFileReader)
  27. private
  28. fReader: IutlFileReader;
  29. fPrefix: String;
  30. public
  31. function LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  32. constructor Create(const aReader: IutlFileReader; const aPrefix: String);
  33. end;
  34. TutlFileWriterProxy = class(TInterfacedObject, IutlFileWriter)
  35. private
  36. fWriter: IutlFileWriter;
  37. fPrefix: String;
  38. public
  39. procedure SaveStream(const aFilename: String; const aStream: TStream);
  40. constructor Create(const aWriter: IutlFileWriter; const aPrefix: String);
  41. end;
  42. implementation
  43. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  44. //TutlSimpleFileReader//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  45. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46. function TutlSimpleFileReader.LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  47. var
  48. fs: TFileStream;
  49. begin
  50. result := FileExists(aFilename);
  51. if result then begin
  52. fs := TFileStream.Create(aFilename, fmOpenRead);
  53. try
  54. aStream.CopyFrom(fs, fs.Size - fs.Position);
  55. finally
  56. FreeAndNil(fs);
  57. end;
  58. end;
  59. end;
  60. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  61. //TutlSimpleFileWriter//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  62. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  63. procedure TutlSimpleFileWriter.SaveStream(const aFilename: String; const aStream: TStream);
  64. var
  65. fs: TFileStream;
  66. begin
  67. fs := TFileStream.Create(aFilename, fmCreate);
  68. try
  69. fs.CopyFrom(aStream, aStream.Size - aStream.Position);
  70. finally
  71. FreeAndNil(fs);
  72. end;
  73. end;
  74. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  75. //TutlFileReaderProxy///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  76. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  77. function TutlFileReaderProxy.LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  78. var
  79. dir, name: String;
  80. begin
  81. dir := ExtractFilePath(aFilename);
  82. name := ExtractFileName(aFilename);
  83. result := fReader.LoadStream(dir + fPrefix + name, aStream);
  84. end;
  85. constructor TutlFileReaderProxy.Create(const aReader: IutlFileReader; const aPrefix: String);
  86. begin
  87. inherited Create;
  88. fReader := aReader;
  89. fPrefix := aPrefix;
  90. end;
  91. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  92. //TutlFileWriterProxy///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  93. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. procedure TutlFileWriterProxy.SaveStream(const aFilename: String; const aStream: TStream);
  95. var
  96. dir, name: String;
  97. begin
  98. dir := ExtractFilePath(aFilename);
  99. name := ExtractFileName(aFilename);
  100. fWriter.SaveStream(dir + fPrefix + name, aStream);
  101. end;
  102. constructor TutlFileWriterProxy.Create(const aWriter: IutlFileWriter; const aPrefix: String);
  103. begin
  104. inherited Create;
  105. fWriter := aWriter;
  106. fPrefix := aPrefix;
  107. end;
  108. end.