Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.14;
Скачать: CL | DM;

Вниз

CopyFile   Найти похожие ветки 

 
Builder ©   (2004-03-03 02:26) [0]

Здравствуйте, столкнулся с такой проблеммой - делаю:
copyfile("D:\a","C:\a",true); // все нормально, но!

var
s: STRING //причем не важно string или shotstring
begin
S:=edit1.text;
copyfile("D:\a",S,true);
end.
несоответствие типов String и TAnsiChar

если объявляю: S: TAnsiChar;, то уже у Edit"а :((тоже самое (что впрочем естественно), а вот как выпутаться не понимаю...


 
Builder ©   (2004-03-03 02:26) [1]

И еще, может кто обяснить что такое TAnsiChar?


 
Defunct ©   (2004-03-03 02:37) [2]

Var S:String

Begin
S:=Edit1.Text;
CopyFile("D:\a", PChar(S), True);
...


PChar отличпется от String тем, что последним символом такой строки будет символ #0. Не забываем также что и PChar и String являются указателем на строку.


 
Германн ©   (2004-03-03 03:22) [3]

2 Defunct © (03.03.04 02:37) [2]
Выражайтесь, плиииз, точнее. PChar от String отличается гораздо более! Кроме того и String есть разные! А то что они все являются "указателем на строку", имхо ясно и ежу.

А пример ответа, абсолютно правильный. Имхо.


 
Defunct ©   (2004-03-03 03:30) [4]

> Выражайтесь, плиииз, точнее. PChar от String отличается гораздо более!

Угу, но для файловой системы принципиальным является именно последний #0.


 
Германн ©   (2004-03-03 03:51) [5]

Может я чего-то не понял. Может я вообще "Даун"?, но причем тут связь "файловой системы" и "последнего #0"?


 
Defunct ©   (2004-03-03 04:03) [6]

Германн © (03.03.04 03:51) [5]
Поясню:
Так повелось, что еще с DOS 1.0 в роли имени файла выступала AsciiZ строка. В Win32 эта особенность не изменилась. Используя напрямую функцию Kernel32 (CopyFile) в роли имен файлов выступают две именно AsciiZ строки. Надеюсь что такое AsciiZ строка Вы в курсе, на всякий случай пример:

DB "myfile.txt"+#0


 
Германн ©   (2004-03-03 04:44) [7]

2 Defunct © (03.03.04 04:03) [6]

Что именно "выступало в роли имени файла" я не знаю. Да и бог с ним! Что такое "роль имени файла"?

В DOS, если уж пошла "пьяная разборка", относитетельно "имен файлов", существовала FAT. Переводить не буду. Никаких #0 в ней не было. Был список файлов с указанием начального кластера и размера. Нигде в DOS - напрямую, не было Ascizz строк!

Если же имеется в виду параметры типа "LPCTSTR", так надо сразу указать, что они значат.


 
Defunct ©   (2004-03-03 05:12) [8]

> В DOS, если уж пошла "пьяная разборка", относитетельно "имен файлов", существовала FAT.

Причем тут FAT?
Не надо путать FAT и имя файла, эти понятия несовместимы. Имя файла есть и в NTFS, и в HPFS, в любой FS.


Никаких #0 в ней не было.
В FAT может быть что угодно, это просто таблица цепочек с номерами кластеров. Кстати, 0 в FAT обозначает свободный кластер. Адресация диска начинается с кластера №2.

Возвращаясь к теме:
В DOS было даже понятие AsciiZZ (это чтоб ParamStr(0) выловить из PSP). Функции открытия и создания файлов:
AH = 3Ch (создание)
AH = 3Dh (открытие)
DS:DX - адрес AsciiZ строки имени файла.

Был список файлов с указанием начального кластера и размера. Нигде в DOS - напрямую, не было Ascizz строк!

Опять же причем тут список? Когда речь идет о функциях с полным именем файла.

Для ликбеза советую открыть TechHelp и освежить память о функциях DOS (Int 21h), а также о структуре логических дисков.


 
Defunct ©   (2004-03-03 05:36) [9]

Германн © (03.03.04 04:44) [7]
Что именно "выступало в роли имени файла" я не знаю. Да и бог с ним! Что такое "роль имени файла"?

Может я выразился не однозначно.
Давайте перефразируем: ... в качестве имени файла выступает AsciiZ строка ...


 
Юрий Зотов ©   (2004-03-03 06:01) [10]

> Defunct © (03.03.04 02:37) [2]

> PChar отличпется от String тем, что последним символом такой
> строки будет символ #0.

Все же, вот как раз ЭТИМ они и НЕ отличаются (поскольку завершающий ноль есть и там, и там). Они ДРУГИМ отличаются.

> Defunct © (03.03.04 04:03) [6]

> Используя напрямую функцию Kernel32 (CopyFile) в роли имен
> файлов выступают две именно AsciiZ строки.

Все же, не сами ASCIIZ-строки, а указатели на них.


 
Defunct ©   (2004-03-03 06:31) [11]

> Все же, вот как раз ЭТИМ они и НЕ отличаются (поскольку завершающий ноль есть и там, и там). Они ДРУГИМ отличаются.

Заблуждался относительно String, проверил действительно #0 есть (перепутал с ShortString). Ну а чем же тогда (физически получается ничем), разве только способом работы с такими стороками компилятора и директивой {$H-}?

>> Используя напрямую функцию Kernel32 (CopyFile) в роли имен
>> файлов выступают две именно AsciiZ строки.

> Все же, не сами ASCIIZ-строки, а указатели на них.


Спасибо что поправили, разумеется указатели.


 
Юрий Зотов ©   (2004-03-03 18:58) [12]

> Defunct © (03.03.04 06:31) [11]

> Ну а чем же тогда (физически получается ничем)

PChar - чистый указатель на тело строки и более ничего.
String - указатель на структуру вида:

Смещение Содержимое
-8 Счетчик ссылок
-4 Длина в байтах
0 Начало тела ASCIIZ-строки


Как видим, физически PChar и String действительно не отличаются ничем (в смысле того, что они содержат один и тот же адрес) - и понятно, почему (чтобы сделать String совместимым с сишными строками). Но вот логически разница между ними огромная - управляемое время жизни.


 
Defunct ©   (2004-03-03 19:18) [13]

Юрий Зотов © (03.03.04 18:58) [12]

Спасибо, прояснили ситуацию. Сам бы я не догадался залезть по смещению -4 и -8, а в хелпе об этом не говорится.


 
VMcL ©   (2004-03-03 20:24) [14]

>>Defunct © (03.03.04 19:18) [13]

Вобщем-то говорится:
F1 | Index | "Long strings"

AnsiString, also called a long string, represents a dynamically allocated string whose maximum length is limited only by available memory. It uses 8-bit ANSI characters.
A long-string variable is a pointer occupying four bytes of memory. When the variable is empty—that is, when it contains a zero-length string—the pointer is nil and the string uses no additional storage. When the variable is nonempty, it points to a dynamically allocated block of memory that contains the string value, a 32-bit length indicator, and a 32-bit reference count. This memory is allocated on the heap, but its management is entirely automatic and requires no user code.

Because long-string variables are pointers, two or more of them can reference the same value without consuming additional memory. The compiler exploits this to conserve resources and execute assignments faster. Whenever a long-string variable is destroyed or assigned a new value, the reference count of the old string (the variable’s previous value) is decremented and the reference count of the new value (if there is one) is incremented; if the reference count of a string reaches zero, its memory is deallocated. This process is called reference-counting. When indexing is used to change the value of a single character in a string, a copy of the string is made if—but only if—its reference count is greater than one. This is called copy-on-write semantics.


P.S.
А смещения в Help"е не приводятся, потому как считаются Borland"ом зависимыми от версии компилятора (уже много версий подряд :)



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

Текущий архив: 2004.03.14;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
4-43972
Unknown
2004-01-07 09:17
2004.03.14
Память, занятая процессом


1-43481
Rim
2004-02-29 14:50
2004.03.14
Bitmap в Image


1-43575
Eagle-XK
2004-02-27 15:24
2004.03.14
Непонятка м ListView ом


8-43685
JB
2003-11-05 12:18
2004.03.14
Кривые Безье


3-43344
Rumba
2004-02-16 16:36
2004.03.14
FIBPlus 5.08 master-detail