瀏覽代碼

Files.Truncate fix

Arthur Yefimov 1 年之前
父節點
當前提交
de01e2c41f
共有 1 個文件被更改,包括 13 次插入2 次删除
  1. 13 2
      src/Files.Mod

+ 13 - 2
src/Files.Mod

@@ -357,7 +357,7 @@ END CacheEntry;
 %RU Открывает файл с заданным именем файла, если он существует. Возвращает
 %RU Открывает файл с заданным именем файла, если он существует. Возвращает
     объект, представляющий этот файл. Если файл не существует, возвращает NIL.
     объект, представляющий этот файл. Если файл не существует, возвращает NIL.
      Если вы пишете в файл, открытый с помощью Old, изменения будут сохранены
      Если вы пишете в файл, открытый с помощью Old, изменения будут сохранены
-     на носителе информации только после вызова Register или Close. *)
+    на носителе информации только после вызова Register или Close. *)
 PROCEDURE Old*(name: ARRAY OF CHAR): File;
 PROCEDURE Old*(name: ARRAY OF CHAR): File;
 VAR f: File;
 VAR f: File;
   fd: Platform.FileHandle;
   fd: Platform.FileHandle;
@@ -660,7 +660,18 @@ END WriteBytes;
 %RU Усекает файл в позиции `pos`.
 %RU Усекает файл в позиции `pos`.
     Длина файла будет равна `pos`. *)
     Длина файла будет равна `pos`. *)
 PROCEDURE Truncate*(F: File; pos: INTEGER);
 PROCEDURE Truncate*(F: File; pos: INTEGER);
-BEGIN F.len := pos (*!FIXME*)
+VAR error: Platform.ErrorCode;
+  i: INTEGER;
+  buf: Buffer;
+BEGIN (*!FIXME*)
+  error := Platform.TruncateFile(F.fd, pos);
+  F.len := pos;
+  FOR i := 0 TO NumBufs - 1 DO
+    buf := F.bufs[i];
+    IF (buf # NIL) & (buf.org <= pos) & (pos < buf.org + buf.size) THEN
+      buf.size := pos - buf.org
+    END
+  END
 END Truncate;
 END Truncate;
 
 
 (** Deletes (deregisters) a file with the given name from the storage media.
 (** Deletes (deregisters) a file with the given name from the storage media.