亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vs_core.pas

?? KSDev.VirtualSream.v1.01.rar 虛擬文件系統,
?? PAS
?? 第 1 頁 / 共 3 頁
字號:
{==============================================================================

  Virtual Stream
  Copyright (C) 2004-2006 by Eugene Kryukov
  All rights reserved

  See License.txt for licence information

  $Id: vs_core.pas,v 1.1.1.1 2006/09/26 09:49:37 eugene Exp $

===============================================================================}

unit vs_core;

{$I vs_define.inc}

interface

uses
  SysUtils, Classes, vs_masks, vs_resource;

type
  TSign = array[0..6] of char;
  
const
  VFSSignature: TSign = 'VFILEST';

  EmptyBlock: longword   = $FFFFFFFC;
  EndBlock: longword     = $FFFFFFFE;
  BadBlock: longword     = $FFFFFFFA;

  BlockSize = 4096;

  DirDivider     = '\/';

  EraseSymbol    = #254;

  deSelf         = 0;
  deParent       = 1;

type

  TFileSystem = class;

  TFAT = array of longword;

  TFileEntry = record
    Name: string;
    Size: longword;
    Attr: longword;
    Date: TDateTime;
    Link: longword;
    Res: array [0..15] of byte;
  end;

  TFileEntryArray = array of TFileEntry;

  TDir = class;

  TFile = class
  private
    FEntry: TFileEntry;
    FPosition: longword;
    FMode: Word;
    FDir: TDir;
    FIndex: longword;
  public
    constructor CreateEmpty(const AFileName: string; ADir: TDir; AMode: Word);
    constructor CreateOpen(const AFileName: string; ADir: TDir; AMode: Word);
    destructor Destroy; override;
    { access }
    function Size: longword;
    function Date: TDateTime;
  end;

  TDirEntry = record
    Count: longword;
    Files: TFileEntryArray;
  end;

  TDir = class
  private
    FEntry: TDirEntry;
    FFileSystem: TFileSystem;
  public
    constructor CreateEmpty(AFileSystem: TFileSystem; ParentLink, CurLink: longword);
    constructor CreateOpen(AFileSystem: TFileSystem; Link: longword);
    function GetSize: longword;
    procedure SaveDir;
    { add new }
    function AddEntry(AName: string; AAttr: longword; ALink: longword): boolean;
    { directory }
    function CreateDirEntry(Parent: longword): TDir;
    function OpenDirEntry(DirLink: longword): TDir;
    { check }
    function DirExists(AName: string): boolean;
  end;

  TFileSystem = class
  private
    { Header }
    Sign: TSign;
    FATSize: longword;
    FATPos: longword;
    FAT: TFAT;
    RootLink: longword; // link to cluster
    Reserved: array [1..1020] of byte;
    { Header end }
    ReadOnly: Longbool;
    Compress: Longbool;
    FRoot: TDir;
    FStream: TStream;
    { Files handle }
    FDirs: TStringList;
    FFiles: TStringList;
    FMode: Word;
    function FATOffset(): longword;
    function DataOffset(): longword;
    function ReadOnlyOffset(): longword;
    procedure SaveFAT(const Index, Value: longword);
  public
    constructor CreateEmpty(Stream: TStream; AReadOnly: boolean = false;
      ACompress: boolean = false; AMaxSize: longword = 16384);
    constructor CreateOpen(Stream: TStream; const Mode: Word);
    destructor Destroy;
    { low-level routines }
    function FindNextLink(const ALink: longword): longword;
    function LoadData(Link: longword; const Buf: PByteArray; const Pos, Size: longword): longword;
    function SaveData(Link: longword; const Buf: PByteArray; const Pos, Size: longword): longword;
    procedure EraseData(Link: longword);
    { low level directory }
    function GetDir(CurDir: TDir; Path, CurPath: string): TDir;
    { high level routines }
    procedure CreateDir(const ADirName: string);
    procedure ForceDir(ADirName: string);
    function CreateFile(const AFileName: string): TFile;
    function OpenFileRead(const AFileName: string): TFile;
    function OpenFileWrite(const AFileName: string): TFile;
    procedure CloseFile(AFile: TFile);
    procedure EraseFile(AFile: TFile);

    function FileExists(const AFileName: string): boolean;
    function DirectoryExists(const AFileName: string): boolean;

    function Write(const F: TFile; Buf: Pointer; const ASize: longword): longword;
    function Read(const F: TFile; Buf: Pointer; const ASize: longword): longword;

    procedure SetReadOnly(Value: boolean);

    function FindFirst(const Path: string; Attr: Integer;
      var F: TSearchRec): Integer;
    function FindNext(var F: TSearchRec): Integer;
    procedure FindClose(var F: TSearchRec);
    property Root: TDir read FRoot;
    property Compressed: Longbool read Compress;
    property IsReadOnly: Longbool read ReadOnly;
  end;

  TFileSystemStream = class(TStream)
  private
    FFileSystem: TFileSystem;
    FFileHandle: TFile;
  protected
    procedure SetSize(NewSize: Longint); override;
    {$IFDEF KS_COMPILER6_UP}
    procedure SetSize(const NewSize: Int64); override;
    {$ENDIF}
  public
    constructor Create(const AFileSystem: TFileSystem; const FileName: string; Mode: Word); overload;
    destructor Destroy; override;
    function Read(var Buffer; Count: Longint): Longint; override;
    function Write(const Buffer; Count: Longint): Longint; override;
    {$IFDEF KS_COMPILER6_UP}
    function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
    {$ELSE}
    function Seek(Offset: Longint; Origin: Word): Longint; override;
    {$ENDIF}
    property FileHandle: TFile read FFileHandle;
  end;

implementation {===============================================================}

procedure Log(AText: string);
begin
  { error log }
end;

function GetFirstDir(var Path: string): string;
var
  i: byte;
  CopyS: string;
begin
  Result := '';
  if Path = '' then Exit;
  if Pos(Path[1], DirDivider) > 0 then
    Delete(Path, 1, 1); // remove root

  CopyS := Path;
  for i := 1 to Length(CopyS) do
  begin
    Delete(Path, 1, 1);
    if Pos(CopyS[i], DirDivider) > 0 then Break;
    Result := Result + CopyS[i];
  end;
end;

function GetPath(const FileName: string): string;
var
  I: Integer;
begin
  I := LastDelimiter(DirDivider, FileName);
  Result := Copy(FileName, 1, I);
end;

function GetName(const FileName: string): string;
var
  I: Integer;
begin
  I := LastDelimiter(DirDivider, FileName);
  Result := Copy(FileName, I + 1, MaxInt);
end;

{ TFile }

constructor TFile.CreateEmpty(const AFileName: string; ADir: TDir; AMode: Word);
var
  CurLink: longword;
begin
  inherited Create;

  FDir := ADir;
  CurLink := FDir.FFileSystem.FindNextLink(EmptyBlock);
  FDir.FFileSystem.SaveFAT(CurLink, EndBlock);
  if FDir.AddEntry(AFileName, 0, CurLink) then
  begin
    FIndex := ADir.FEntry.Count - 1;
    FEntry := ADir.FEntry.Files[FIndex];
    FEntry.Date := Now;
    FEntry.Size := 0;
    FMode := AMode;
    FPosition := 0;

    FDir.FEntry.Files[FIndex] := FEntry;
    FDir.SaveDir;
  end
  else
  begin
    Log('can''t add new entry');
    FPosition := BadBlock;
  end;
end;

constructor TFile.CreateOpen(const AFileName: string; ADir: TDir; AMode: Word);
var
  i: integer;
begin
  inherited Create;
  FDir := ADir;
  for i := 0 to FDir.FEntry.Count - 1 do
    if CompareText(FDir.FEntry.Files[i].Name, AFileName) = 0 then
    begin
      FIndex := i;
      FEntry := ADir.FEntry.Files[FIndex];
      FMode := AMode;
      FPosition := 0;
      Exit;
    end;
//  Log('Can''t found file ' + AFileName);
  FPosition := BadBlock;
  FDir := nil;
end;

destructor TFile.Destroy;
begin
  if (FDir <> nil) and (FPosition <> BadBlock) then
  begin
    FDir.FEntry.Files[FIndex] := FEntry;
    FDir.SaveDir;
  end;
  inherited;
end;

function TFile.Size: longword;
begin
  Result := FEntry.Size;
end;

function TFile.Date: TDateTime;
begin
  Result := FEntry.Date;
end;

{ TDir ========================================================================}

constructor TDir.CreateEmpty(AFileSystem: TFileSystem; ParentLink, CurLink: longword);
begin
  inherited Create;
  FFileSystem := AFileSystem;

  FEntry.Count := 2;
  SetLength(FEntry.Files, FEntry.Count);
  with FEntry.Files[deSelf] do
  begin
    Name := '.';
    Size := 0;
    Date := Now;
    Attr := faDirectory;
    Link := CurLink;
  end;
  with FEntry.Files[deParent] do
  begin
    Name := '..';
    Size := 0;
    Date := Now;
    Attr := faDirectory;
    Link := ParentLink;
  end;
  SaveDir;
end;

constructor TDir.CreateOpen(AFileSystem: TFileSystem; Link: longword);
var
  i: integer;
  M: TMemoryStream;
  S: longword;
begin
  inherited Create;
  FFileSystem := AFileSystem;
  M := TMemoryStream.Create;

  FFileSystem.LoadData(Link, PByteArray(@S), 0, SizeOf(S));
  M.Size := S;
  FFileSystem.LoadData(Link, PByteArray(M.Memory), SizeOf(S), M.Size);
  M.Position := 0;

  FEntry.Count := ReadLongword(M);
  SetLength(FEntry.Files, FEntry.Count);
  for i := 0 to FEntry.Count - 1 do
    with FEntry do
    begin
      Files[i].Name := ReadString(M);
      Files[i].Size := ReadLongword(M);
      Files[i].Attr := ReadLongword(M);
      Files[i].Date := ReadDouble(M);
      Files[i].Link := ReadLongword(M);
      ReadBuf(M, @Files[i].Res, SizeOf(Files[i].Res));
    end;
  M.Free;
end;

function TDir.GetSize: longword;
begin
  Result := SizeOf(FEntry.Count) + (FEntry.Count * SizeOf(TFileEntry));
end;

procedure TDir.SaveDir;
var
  i: integer;
  M: TMemoryStream;
  S: longword;
begin
  M := TMemoryStream.Create;
  WriteLongword(M, FEntry.Count);
  for i := 0 to FEntry.Count - 1 do
    with FEntry do
    begin
      WriteString(M, Files[i].Name);
      WriteLongword(M, Files[i].Size);
      WriteLongword(M, Files[i].Attr);
      WriteDouble(M, Files[i].Date);
      WriteLongword(M, Files[i].Link);
      WriteBuf(M, @Files[i].Res, SizeOf(Files[i].Res));
    end;
  S := M.Size;
  FFileSystem.SaveData(FEntry.Files[deSelf].Link, PByteArray(@S), 0, SizeOf(S));
  FFileSystem.SaveData(FEntry.Files[deSelf].Link, PByteArray(M.Memory), SizeOf(S), M.Size);
  M.Free;
end;

function TDir.AddEntry(AName: string; AAttr, ALink: longword): boolean;
var
  i: integer;
begin
  Result := false;
  for i := 0 to FEntry.Count - 1 do
    if CompareText(FEntry.Files[i].Name, AName) = 0 then
    begin
      Log('Entry ' + AName + ' alredy exists');
      Result := false;
      Exit;
    end;

  Result := true;
  
  FEntry.Count := FEntry.Count + 1;
  SetLength(FEntry.Files, FEntry.Count);
  with FEntry.Files[FEntry.Count - 1] do
  begin
    Name := AName;
    Attr := AAttr;
    Link := ALink;
  end;
  SaveDir;
end;

{ directories }

function TDir.CreateDirEntry(Parent: longword): TDir;
var
  CurLink: longword;
begin
  CurLink := FFileSystem.FindNextLink(EmptyBlock);
  FFileSystem.SaveFAT(CurLink, EndBlock);

  Result := TDir.CreateEmpty(FFileSystem, Parent, CurLink);
end;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区四区亚洲| 国产精品美女www爽爽爽| 国产成人小视频| 日本不卡123| 美女视频网站黄色亚洲| 日韩国产一二三区| 亚洲午夜在线电影| 亚洲一区二区在线视频| 夜夜揉揉日日人人青青一国产精品| 成人欧美一区二区三区小说| 中文字幕在线免费不卡| 亚洲同性gay激情无套| 亚洲日本在线天堂| 亚洲国产综合91精品麻豆| 一区二区三区小说| 亚洲va国产va欧美va观看| 午夜精品一区二区三区免费视频| 日日夜夜精品视频天天综合网| 免费在线看成人av| 国产一区二区在线视频| 国产成人亚洲综合a∨猫咪| 成人爽a毛片一区二区免费| 成人h动漫精品| 91色.com| 欧美一级免费大片| 久久久久国产精品麻豆ai换脸 | 亚洲国产视频一区| 视频一区免费在线观看| 久久99精品网久久| 99久久久免费精品国产一区二区| 色视频一区二区| 日韩三级伦理片妻子的秘密按摩| 国产婷婷色一区二区三区四区 | 亚洲三级小视频| 日韩av一级片| 成人一级黄色片| 欧美日韩电影在线| 国产精品三级电影| 婷婷久久综合九色综合伊人色| 国产在线播放一区三区四| 色综合一区二区三区| 欧美疯狂性受xxxxx喷水图片| 欧美精品一区二| 亚洲午夜免费电影| www.亚洲精品| 日韩欧美国产精品| 一区二区高清在线| 国产69精品久久99不卡| 欧美一区二区在线观看| 国产精品视频一二三| 免费在线看一区| 欧美性感一类影片在线播放| 久久久久9999亚洲精品| 亚洲国产成人av| 91免费国产在线观看| 久久精品视频在线看| 首页国产欧美久久| 欧美中文字幕久久| 中文字幕在线免费不卡| 国产精一区二区三区| 欧美一级高清片| 日欧美一区二区| 91成人免费电影| 国产精品久久久久久久裸模| 久久99久久精品欧美| 欧美日韩激情一区二区| 最新热久久免费视频| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 亚洲国产综合在线| 色婷婷av一区二区三区大白胸| 精品国产免费一区二区三区四区 | 青青草视频一区| 欧美午夜一区二区三区免费大片| 亚洲天堂精品在线观看| 99视频一区二区三区| 欧美高清在线精品一区| 国产一区二区三区免费在线观看| 日韩欧美中文字幕制服| 美女视频黄 久久| 欧美一级一区二区| 精品一区二区国语对白| 精品国产免费人成在线观看| 国产主播一区二区| 久久久久久一二三区| 国产九色sp调教91| 中文字幕亚洲成人| 色哟哟亚洲精品| 亚洲大片一区二区三区| 欧美日韩成人在线| 老司机午夜精品99久久| 欧美mv和日韩mv的网站| 国产精品一区免费在线观看| 国产欧美一区在线| 色综合久久久网| 日韩国产成人精品| 精品久久久久香蕉网| 国产在线国偷精品产拍免费yy| 国产色产综合色产在线视频| 99久久免费精品| 亚洲成av人在线观看| 欧美成人免费网站| 成人精品视频一区| 亚洲一区二区综合| 精品久久久久香蕉网| 不卡的av在线| 石原莉奈一区二区三区在线观看| 精品成人a区在线观看| 成人av网站在线| 午夜免费久久看| 久久久久久9999| 欧美日韩激情一区二区| 国产一区不卡视频| 一区二区三区在线观看欧美| 日韩精品一区二区三区中文精品| 国产东北露脸精品视频| 亚洲一级片在线观看| 精品久久99ma| 欧美性做爰猛烈叫床潮| 国产一区二区0| 青娱乐精品视频在线| 一区二区在线电影| 久久久午夜精品| 91精品婷婷国产综合久久竹菊| 国产成人日日夜夜| 日韩—二三区免费观看av| 国产精品美女视频| 日韩一区二区三区免费看| 91视频在线观看免费| 国产伦精品一区二区三区免费迷 | 一区二区三区在线观看动漫| 精品国产99国产精品| 欧美伊人久久久久久久久影院 | gogo大胆日本视频一区| 激情偷乱视频一区二区三区| 一区二区三区在线观看国产| 国产亚洲va综合人人澡精品 | 日本一区二区三区久久久久久久久不| 欧美久久久久久久久中文字幕| 成人激情小说网站| 久久综合综合久久综合| 亚洲国产精品人人做人人爽| 亚洲视频综合在线| 国产午夜一区二区三区| 精品久久一二三区| 日韩久久精品一区| 欧美日本韩国一区| 欧美中文字幕久久| 在线观看视频一区二区欧美日韩| 99久免费精品视频在线观看| 成人性生交大片免费看中文网站| 国产一区在线视频| 国产精品一区二区在线观看网站| 久久99热这里只有精品| 日本 国产 欧美色综合| 午夜成人免费视频| 午夜天堂影视香蕉久久| 亚洲大片在线观看| 丝袜美腿亚洲色图| 日韩av网站在线观看| 毛片av一区二区| 精品一区二区三区久久久| 久久福利资源站| 国产老肥熟一区二区三区| 国产91对白在线观看九色| 成人免费视频app| 91在线视频播放地址| 欧洲一区二区三区在线| 欧美精品自拍偷拍| 日韩欧美成人一区二区| 久久综合精品国产一区二区三区| 久久久久9999亚洲精品| 一区在线观看视频| 一区二区高清免费观看影视大全| 亚洲妇熟xx妇色黄| 久久精品理论片| 成人美女视频在线看| 欧日韩精品视频| 欧美一区二区久久| 久久精品夜夜夜夜久久| 亚洲精品久久嫩草网站秘色| 午夜在线成人av| 极品美女销魂一区二区三区免费 | 亚洲特黄一级片| 日韩电影在线观看一区| 国内精品写真在线观看| www.成人在线| 欧美人体做爰大胆视频| 精品国产露脸精彩对白| 亚洲视频在线观看三级| 亚洲成av人综合在线观看| 国产一区二区三区日韩| 欧美在线不卡一区| 精品欧美一区二区久久| 亚洲欧美在线aaa| 美女国产一区二区三区| 91久久香蕉国产日韩欧美9色| 欧美一级搡bbbb搡bbbb| 亚洲激情自拍视频| 狠狠色丁香久久婷婷综合丁香| 91浏览器在线视频|