-
Как узнать размер файла, для работы с файлами хочу использовать функции : _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);
-
Удалено модератором
-
Так в FileSize(f); нужно указывать переменную типа file, а значит assign(f,'xz.txt') и т.д..., сами же сказали что нужно пользоваться стандартными ОСовскими функциями что бы небыло проблем.... =(((
-
Как нить через хендл можно сделать?...
-
> Как нить через хендл можно сделать?
Можно и "через".
GetFileSize
Get = Получить File = Файл Size = Размер
-
> [3] Andrewtitoff © (04.02.08 17:13) > Как нить через хендл можно сделать?...
можно и без хэндла: FindFirstFile
-
Удалено модератором
-
2 Сергей М. Пасиба Ну не ты именно, но вы все там утверждали что это верно что нужно все переделывать через хендлы или стримы..
-
>[2] Andrewtitoff©(04.02.08 17:11) есть такое соглашение: функции, начинающиеся с подчёркивания — несколько интимны, и лучше их не использовать.
-
Ну хорошо.
Пусть не я. но кто-то ведь тебе задавал вопрос, почему именно это самое "хочу"
> для работы с файлами хочу использовать функции > (далее следует сишная солянка-абракадабра)
ты вдруг захотел ?)
Есть же дельфийсий ФайлСтрим, есть кроме него огромная куча дельфийских "инструментов" для великолепного по наглядности/удобству/эффективности доступа к файловой подсистеме.
Эта куча чем тебя не удовлетворила ?)
-
Чего то я запутался.... А как?, в чем ошибка?, какого типа должен быть Buf?
var
FHandle1 : Integer;
FHandle2 : Integer;
FileSize : integer;
Buf : PChar;
implementation
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;
-
Не ну просто сказали на родных ОСовских лучше , вот я и подумал... =)))
-
> [10] Andrewtitoff © (04.02.08 18:05)
память кто под buf выделять будет?
-
>[11] Andrewtitoff©(04.02.08 18:06) нет, как раз подумать ты забыл…
-
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;
-
> Как узнать размер файла
_llseek если ты хочешь пользоваться _l функциями
-
> FD.nFileSizeHigh * 4294967296
лучше FD.nFileSizeHigh shl 32 )
-
> Andrewtitoff © (04.02.08 18:06) [11] > Не ну просто сказали на родных ОСовских лучше , вот я и > подумал... =)))
Есть родная осовская CopyFileTo (ну почти осовская :) ). Свою то зачем писать ?
-
Да, перед тем как ее вызвать желательно проверить, что Дест файла нету, а если он есть - грохнуть его. Перед гроханием на всякий случай почистить ему флаги.
-
2 Игорь Шевченко Спасибо!, ну ечли вы не рекомендуете функции "_l", значит небудем ими пользоваться..., тогда подскажите чем лучше пользоваться (стримами или хендлами), лучше для меня имеется ввиду что бы снизить возможность возникновения I/O error -ов, по скорости для меня в принципе не принципиально, так как файлы с которыми мне нужно работать не превышают по размеру 1Мб...
2 ANB Спасибо!, а чем лучше удалять файлы?, и как лучше переименовывать самому копировать и затем удалять или пользоваться комими то стандартными функциями? Да и посоветуйте пожалуйста как грамотно почистить флаги?
|