Конференция "WinAPI" » Как узнать размер файла
 
  • Andrewtitoff © (04.02.08 17:02) [0]
    Как узнать размер файла, для работы с файлами хочу использовать функции :
    _lcreat(PathName: PChar; Attribute: Integer):
    _lclose(FileHandle: Integer): Integer;
    _lopen(PathName: Char; ReadWrite: Integer): Integer;
    _lread(FileHandle: Integer; Buffer: PChar; Bytes: Integer): Word;
    _lwrite(FileHandle: Integer; Buffer: PChar; Bytes: Integer): Word;

    Так вот как просто скопировать файл т.е.

    _lcreat(PathName1,Attribute);
    _lcreat(PathName2,Attribute);

    как тут узнать сколько байт считывать?, или придется читать по байту пока не возвратится 0?
    _lread(FileHandle,Buffer,Bytes);
    _lwrite(FileHandle,Buffer,Bytes);
    _lclose(FileHandle1);
    _lclose(FileHandle1);
  • Сергей М. © (04.02.08 17:05) [1]
    Удалено модератором
  • Andrewtitoff © (04.02.08 17:11) [2]
    Так в FileSize(f); нужно указывать переменную типа file, а значит assign(f,'xz.txt') и т.д...,
    сами же сказали что нужно пользоваться стандартными ОСовскими функциями что бы небыло проблем....  =(((
  • Andrewtitoff © (04.02.08 17:13) [3]
    Как нить через хендл можно сделать?...
  • Сергей М. © (04.02.08 17:17) [4]

    > Как нить через хендл можно сделать?


    Можно и "через".

    GetFileSize

    Get = Получить
    File = Файл
    Size = Размер
  • clickmaker © (04.02.08 17:18) [5]

    > [3] Andrewtitoff ©   (04.02.08 17:13)
    > Как нить через хендл можно сделать?...

    можно и без хэндла: FindFirstFile
  • Сергей М. © (04.02.08 17:19) [6]
    Удалено модератором
  • Andrewtitoff © (04.02.08 17:27) [7]
    2 Сергей М.
    Пасиба
    Ну не ты именно, но вы все там утверждали что это верно что нужно все переделывать через хендлы или стримы..
  • ketmar © (04.02.08 17:35) [8]
    >[2] Andrewtitoff©(04.02.08 17:11)
    есть такое соглашение: функции, начинающиеся с подчёркивания — несколько интимны, и лучше их не использовать.
  • Сергей М. © (04.02.08 17:37) [9]
    Ну хорошо.

    Пусть не я. но кто-то ведь тебе задавал вопрос, почему именно это самое "хочу"


    > для работы с файлами хочу использовать функции
    > (далее следует сишная солянка-абракадабра)


    ты вдруг захотел ?)

    Есть же  дельфийсий ФайлСтрим, есть кроме него огромная куча дельфийских "инструментов" для великолепного по наглядности/удобству/эффективности доступа к файловой подсистеме.

    Эта куча чем тебя не удовлетворила ?)
  • Andrewtitoff © (04.02.08 18:05) [10]
    Чего то я запутался....
    А как?, в чем ошибка?, какого типа должен быть Buf?

    var
    FHandle1 : Integer;
    FHandle2 : Integer;
    FileSize : integer;
     Buf : PChar;

    implementation

    {$R *.dfm}
    procedure CopyF(Name1,Name2 : PAnsiChar);
    begin
    FHandle1:=_lopen(Name1,0);
    FHandle2:=_lcreat(Name2,0);
    FileSize   := GetFileSize(FHandle1, nil);
    If FHandle1 = -1 then showmessage('Error'+Inttostr(IOResult)) else
    begin
    _lread(FHandle1,Buf,FileSize);
    _lwrite(FHandle2,Buf,FileSize);
    end;
    _lclose(FHandle1);
    _lclose(FHandle2);
    end;

  • Andrewtitoff © (04.02.08 18:06) [11]
    Не ну просто сказали на родных ОСовских лучше , вот я и подумал...  =)))
  • clickmaker © (04.02.08 18:22) [12]

    > [10] Andrewtitoff ©   (04.02.08 18:05)

    память кто под buf выделять будет?
  • ketmar © (04.02.08 18:38) [13]
    >[11] Andrewtitoff©(04.02.08 18:06)
    нет, как раз подумать ты забыл…
  • DVM © (04.02.08 22:51) [14]
    function FileSize(const FileName: String): Int64;
    var
     FD : TWin32FindData;
     FH : THandle;
    begin
     Result := 0;
     FH := FindFirstFile(PChar(FileName), FD);
     if FH = INVALID_HANDLE_VALUE then exit;
     Result := FD.nFileSizeHigh * 4294967296 + FD.nFileSizeLow;
     Windows.FindClose(FH);
    end;

  • Игорь Шевченко © (05.02.08 09:58) [15]

    > Как узнать размер файла


    _llseek если ты хочешь пользоваться _l функциями
  • clickmaker © (05.02.08 11:26) [16]

    > FD.nFileSizeHigh * 4294967296

    лучше FD.nFileSizeHigh shl 32 )
  • ANB (05.02.08 11:56) [17]

    > Andrewtitoff ©   (04.02.08 18:06) [11]
    > Не ну просто сказали на родных ОСовских лучше , вот я и
    > подумал...  =)))

    Есть родная осовская CopyFileTo (ну почти осовская :) ). Свою то зачем писать ?
  • ANB (05.02.08 11:58) [18]
    Да, перед тем как ее вызвать желательно проверить, что Дест файла нету, а если он есть - грохнуть его. Перед гроханием на всякий случай почистить ему флаги.
  • Andrewtitoff © (06.02.08 13:16) [19]
    2 Игорь Шевченко
    Спасибо!, ну ечли вы не рекомендуете функции "_l", значит небудем ими пользоваться..., тогда подскажите чем лучше пользоваться (стримами или хендлами), лучше для меня имеется ввиду что бы снизить возможность возникновения I/O error -ов, по скорости для меня в принципе не принципиально, так как файлы с которыми мне нужно работать не превышают по размеру 1Мб...

    2 ANB
    Спасибо!, а чем лучше удалять файлы?, и как лучше переименовывать самому копировать и затем удалять или пользоваться комими то стандартными функциями?
    Да и посоветуйте пожалуйста как грамотно почистить флаги?
  • Anatoly Podgoretsky © (06.02.08 13:43) [20]
    > Andrewtitoff  (06.02.2008 13:16:19)  [19]

    При чем тут рекомендации, тут RTFM нужен

    Obsolete Functions

    _hread
    _hwrite
    _lclose
    _lcreat
    _llseek
    _lopen
    _lread
    _lwrite
    OpenFile
    SetHandleCount
  • Andrewtitoff © (08.02.08 13:05) [21]
    2 All
    Подскажите пожалуйста почему при использовании FileStream у меня цикл зацикливается?....

    F := TFileStream.Create(MD+'\p.lft',fmOpenReadWrite);
    ......
      while not i<>0 do
      begin
       i:=F.read(FString,671);
       if i<>0 then sn:=sn+1; else break;
      end;


    Раньше выло так:

    var
    f : file of MyString
    begin
    ......
      while not eof(f) do
      begin
       read(f,FString);
       sn:=sn+1;
      end;


    и все работало...
  • Andrewtitoff © (08.02.08 13:07) [22]
    точнее с "else break;" то естественно не зацикливается, только sn получается на 1 больше, а вот без "else break;" зацикливается....
  • Сергей М. © (08.02.08 13:20) [23]

    > Andrewtitoff ©   (08.02.08 13:05) [21]


    И эта беда у тебя компилируется ?)
  • ketmar © (08.02.08 13:21) [24]
    >while not i<>0 do
    это что за хренотень?

    ---
    Understanding is not required. Only obedience.
  • Andrewtitoff © (08.02.08 13:32) [25]
    2 Сергей М.
    Да, компилируется, а что не так?

    2 ketmar
    Ой, спасибо!, забыл "not" убрать когда переделывал...  =)))
  • ketmar © (08.02.08 13:38) [26]
    >[25] Andrewtitoff © (2008-02-08 13:32:00)
    я вообще на этой строке повис. хорошо, пиво было. она ж в глаза бросается и визжит просто. %-)

    ---
    Understanding is not required. Only obedience.
  • Сергей М. © (08.02.08 13:42) [27]

    > компилируется, а что не так?


    Ну как что ?

    semicolon же перед else )
  • Сергей М. © (08.02.08 13:44) [28]
    И вообще - что ты хочешь от этого кода ?
  • Andrewtitoff © (08.02.08 13:52) [29]
    2 Сергей М
    Ааа, ну это то понятно, его естественно там нет в оригинале...
    Да я просто пока тут все переделываю совсем запарился и незаметил "нот", теперь все нормально, а вообще этот код просто считает количество записей моего типа в файле, я просто сначала все тупо переправил настримы, а теперь вот разбираюсь где что проглядел...,  а вообще конечно надо поменять на  sn:=F.Sise/671 , просто проглядел...
  • ketmar © (08.02.08 14:21) [30]
    >[29] Andrewtitoff © (2008-02-08 13:52:00)
    >этот код просто считает количество записей моего типа в файле
    OMFG! взять размер файла и поделить на размер записи — никак?

    ---
    Understanding is not required. Only obedience.
  • Andrewtitoff © (08.02.08 14:41) [31]
    2 ketmar
    А я что написал выше?.... [29] :
    ......
    а вообще конечно надо поменять на  sn:=F.Sise/671 , просто проглядел...
  • ketmar © (08.02.08 14:47) [32]
    >[31] Andrewtitoff © (2008-02-08 14:41:00)
    соори, я тоже проглядел. %-)

    ---
    Understanding is not required. Only obedience.
  • Игорь Шевченко © (08.02.08 14:57) [33]
    Andrewtitoff ©   (08.02.08 13:05) [21]

    Читаем правила форума и задаем отдельный вопрос в отдельной ветке.
 
Конференция "WinAPI" » Как узнать размер файла
Есть новые Нет новых   [134431   +15][b:0][p:0.002]