Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];

Вниз

Как узнать размер файла   Найти похожие ветки 

 
Andrewtitoff ©   (2008-02-04 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);


 
Сергей М. ©   (2008-02-04 17:05) [1]

Удалено модератором


 
Andrewtitoff ©   (2008-02-04 17:11) [2]

Так в FileSize(f); нужно указывать переменную типа file, а значит assign(f,"xz.txt") и т.д...,
сами же сказали что нужно пользоваться стандартными ОСовскими функциями что бы небыло проблем....  =(((


 
Andrewtitoff ©   (2008-02-04 17:13) [3]

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


 
Сергей М. ©   (2008-02-04 17:17) [4]


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


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

GetFileSize

Get = Получить
File = Файл
Size = Размер


 
clickmaker ©   (2008-02-04 17:18) [5]


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

можно и без хэндла: FindFirstFile


 
Сергей М. ©   (2008-02-04 17:19) [6]

Удалено модератором


 
Andrewtitoff ©   (2008-02-04 17:27) [7]

2 Сергей М.
Пасиба
Ну не ты именно, но вы все там утверждали что это верно что нужно все переделывать через хендлы или стримы..


 
ketmar ©   (2008-02-04 17:35) [8]

>[2] Andrewtitoff©(04.02.08 17:11)
есть такое соглашение: функции, начинающиеся с подчёркивания — несколько интимны, и лучше их не использовать.


 
Сергей М. ©   (2008-02-04 17:37) [9]

Ну хорошо.

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


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


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

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

Эта куча чем тебя не удовлетворила ?)


 
Andrewtitoff ©   (2008-02-04 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 ©   (2008-02-04 18:06) [11]

Не ну просто сказали на родных ОСовских лучше , вот я и подумал...  =)))


 
clickmaker ©   (2008-02-04 18:22) [12]


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

память кто под buf выделять будет?


 
ketmar ©   (2008-02-04 18:38) [13]

>[11] Andrewtitoff©(04.02.08 18:06)
нет, как раз подумать ты забыл…


 
DVM ©   (2008-02-04 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;


 
Игорь Шевченко ©   (2008-02-05 09:58) [15]


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


_llseek если ты хочешь пользоваться _l функциями


 
clickmaker ©   (2008-02-05 11:26) [16]


> FD.nFileSizeHigh * 4294967296

лучше FD.nFileSizeHigh shl 32 )


 
ANB   (2008-02-05 11:56) [17]


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

Есть родная осовская CopyFileTo (ну почти осовская :) ). Свою то зачем писать ?


 
ANB   (2008-02-05 11:58) [18]

Да, перед тем как ее вызвать желательно проверить, что Дест файла нету, а если он есть - грохнуть его. Перед гроханием на всякий случай почистить ему флаги.


 
Andrewtitoff ©   (2008-02-06 13:16) [19]

2 Игорь Шевченко
Спасибо!, ну ечли вы не рекомендуете функции "_l", значит небудем ими пользоваться..., тогда подскажите чем лучше пользоваться (стримами или хендлами), лучше для меня имеется ввиду что бы снизить возможность возникновения I/O error -ов, по скорости для меня в принципе не принципиально, так как файлы с которыми мне нужно работать не превышают по размеру 1Мб...

2 ANB
Спасибо!, а чем лучше удалять файлы?, и как лучше переименовывать самому копировать и затем удалять или пользоваться комими то стандартными функциями?
Да и посоветуйте пожалуйста как грамотно почистить флаги?


 
Anatoly Podgoretsky ©   (2008-02-06 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 ©   (2008-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 ©   (2008-02-08 13:07) [22]

точнее с "else break;" то естественно не зацикливается, только sn получается на 1 больше, а вот без "else break;" зацикливается....


 
Сергей М. ©   (2008-02-08 13:20) [23]


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


И эта беда у тебя компилируется ?)


 
ketmar ©   (2008-02-08 13:21) [24]

>while not i<>0 do
это что за хренотень?

---
Understanding is not required. Only obedience.


 
Andrewtitoff ©   (2008-02-08 13:32) [25]

2 Сергей М.
Да, компилируется, а что не так?

2 ketmar
Ой, спасибо!, забыл "not" убрать когда переделывал...  =)))


 
ketmar ©   (2008-02-08 13:38) [26]

>[25] Andrewtitoff © (2008-02-08 13:32:00)
я вообще на этой строке повис. хорошо, пиво было. она ж в глаза бросается и визжит просто. %-)

---
Understanding is not required. Only obedience.


 
Сергей М. ©   (2008-02-08 13:42) [27]


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


Ну как что ?

semicolon же перед else )


 
Сергей М. ©   (2008-02-08 13:44) [28]

И вообще - что ты хочешь от этого кода ?


 
Andrewtitoff ©   (2008-02-08 13:52) [29]

2 Сергей М
Ааа, ну это то понятно, его естественно там нет в оригинале...
Да я просто пока тут все переделываю совсем запарился и незаметил "нот", теперь все нормально, а вообще этот код просто считает количество записей моего типа в файле, я просто сначала все тупо переправил настримы, а теперь вот разбираюсь где что проглядел...,  а вообще конечно надо поменять на  sn:=F.Sise/671 , просто проглядел...


 
ketmar ©   (2008-02-08 14:21) [30]

>[29] Andrewtitoff © (2008-02-08 13:52:00)
>этот код просто считает количество записей моего типа в файле
OMFG! взять размер файла и поделить на размер записи — никак?

---
Understanding is not required. Only obedience.


 
Andrewtitoff ©   (2008-02-08 14:41) [31]

2 ketmar
А я что написал выше?.... [29] :
......
а вообще конечно надо поменять на  sn:=F.Sise/671 , просто проглядел...


 
ketmar ©   (2008-02-08 14:47) [32]

>[31] Andrewtitoff © (2008-02-08 14:41:00)
соори, я тоже проглядел. %-)

---
Understanding is not required. Only obedience.


 
Игорь Шевченко ©   (2008-02-08 14:57) [33]

Andrewtitoff ©   (08.02.08 13:05) [21]

Читаем правила форума и задаем отдельный вопрос в отдельной ветке.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.094 c
4-1202422124
Master_Of_Puppets
2008-02-08 01:08
2008.12.21
TreeView в чужом приложении


15-1224495616
DillerXX
2008-10-20 13:40
2008.12.21
Поговорим о синих человечках?


3-1211962881
Ламот
2008-05-28 12:21
2008.12.21
Как в firebird 1.5 проиндексировать поле существующей таблицы?


15-1224050613
tesseract
2008-10-15 10:03
2008.12.21
lazarus подновился. исправлена куча ошибок,


2-1226500334
Res
2008-11-12 17:32
2008.12.21
TJpegImage





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский