CustomDoc.pas 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. unit CustomDoc;
  2. interface
  3. uses
  4. Classes,
  5. SysUtils;
  6. type
  7. TProjectFile = class(TComponent)
  8. private
  9. FID: Integer;
  10. FNewID: Integer;
  11. FFlag: Integer;
  12. FGatherID: Integer;
  13. FProjName: string;
  14. FFullPath: string;
  15. public
  16. property NewID: Integer read FNewID write FNewID;
  17. property FullPath: string read FFullPath write FFullPath;
  18. published
  19. property ID: Integer read FID write FID;
  20. property Flag: Integer read FFlag write FFlag;
  21. property GatherID: Integer read FGatherID write FGatherID;
  22. property ProjName: string read FProjName write FProjName;
  23. end;
  24. TAddProjectProc = procedure (aProjFile: TProjectFile; aProjList: TList;
  25. var aFullPath: string) of object;
  26. TCustomProjectDoc = class
  27. public
  28. class procedure ImportProjects(const aFileName: string; aAddProc: TAddProjectProc);
  29. class procedure ExportProjects(const aFileName: string; aFileList: TList);
  30. end;
  31. implementation
  32. { TCustomProjectDoc }
  33. class procedure TCustomProjectDoc.ExportProjects(const aFileName: string;
  34. aFileList: TList);
  35. var
  36. iValue: Integer;
  37. iLoop: Integer;
  38. strFilePath: string;
  39. ProjFile: TProjectFile;
  40. FileStream: TFileStream;
  41. ProjectStream: TFileStream;
  42. begin
  43. FileStream := TFileStream.Create(aFileName, fmCreate);
  44. try
  45. iValue := aFileList.Count;
  46. // 文件个数
  47. FileStream.Write(iValue, SizeOf(iValue));
  48. for iLoop := 0 to aFileList.Count - 1 do
  49. begin
  50. ProjFile := TProjectFile(aFileList.List^[iLoop]);
  51. strFilePath := ProjFile.FullPath;
  52. // 项目信息
  53. FileStream.WriteComponent(ProjFile);
  54. // 文件大小
  55. ProjectStream := TFileStream.Create(ProjFile.FullPath, fmOpenRead);
  56. iValue := ProjectStream.Size;
  57. FileStream.Write(iValue, SizeOf(iValue));
  58. // 文件内容
  59. FileStream.CopyFrom(ProjectStream, iValue);
  60. ProjectStream.Free;
  61. end;
  62. finally
  63. FileStream.Free;
  64. end;
  65. end;
  66. class procedure TCustomProjectDoc.ImportProjects(const aFileName: string; aAddProc: TAddProjectProc);
  67. var
  68. iValue: Integer;
  69. iLoop: Integer;
  70. ProjList: TList;
  71. iFileSize: Integer;
  72. strFilePath: string;
  73. ProjFile: TProjectFile;
  74. FileStream: TFileStream;
  75. ProjectStream: TFileStream;
  76. begin
  77. ProjList := TList.Create;
  78. FileStream := TFileStream.Create(aFileName, fmOpenRead);
  79. try
  80. // 文件个数
  81. FileStream.Read(iValue, SizeOf(iValue));
  82. for iLoop := 0 to iValue - 1 do
  83. begin
  84. // 项目信息
  85. ProjFile := TProjectFile.Create(nil);
  86. FileStream.ReadComponent(ProjFile);
  87. aAddProc(ProjFile, ProjList, strFilePath);
  88. // 文件大小
  89. FileStream.Read(iFileSize, SizeOf(iFileSize));
  90. // 文件内容
  91. ProjectStream := TFileStream.Create(strFilePath, fmCreate);
  92. ProjectStream.CopyFrom(FileStream, iFileSize);
  93. ProjectStream.Free;
  94. end;
  95. finally
  96. FileStream.Free;
  97. for iLoop := 0 to ProjList.Count - 1 do
  98. TProjectFile(ProjList.List^[iLoop]).Free;
  99. ProjList.Free;
  100. end;
  101. end;
  102. end.