ExtractFileDrive — Функция Delphi


ExtractFileDrive — Функция Delphi

На этом шаге мы рассмотрим свойства, методы и события класса TApplication .

Компонент TApplication инкапсулирует приложение при выполнении. Delphi автоматически создает экземпляр Application класса TApplication при выполнении приложения. Для использования этого объекта включите модуль Forms в раздел Uses .

Свойства класса TApplication

TApplication предоставляет несколько свойств, с помощью которых можно отслеживать состояние приложения и контролировать некоторые аспекты его поведения.

  1. property Active: Boolean; — это свойство имеет значение True , если в приложении в текущий момент содержится фокус ввода. Если это свойство приложения имеет значение True , то и свойство Active для одной из форм также равно True . Обычно оно используется для определения, имеет ли приложение фокус ввода перед выводом строки состояния или прорисовкой объекта TCanvas .

Примечания .

  1. Даже будучи неактивным, приложение продолжает получать сообщения о перемещении мыши.
  2. Значение этого свойства можно только читать.

  1. property ExeName: string; — представляет собой строку, содержащую полный путь выполняемого файла. Чаще всего оно используется для определения рабочего каталога приложения, в котором могут находиться файлы данных или инициализации программы.

Примечание . Для выделения из этого свойства рабочего каталога, используйте функции ExtractFileDir или ExtractFilePath . Для получения имени файла — функцию ExtractFileName . Функция ExtractFileExt вернет расширение файла, а функция ExtractFileDrive — имя устройства, на котором расположен файл. Все эти функции находятся в модуле SysUtils .

  1. property Hint: string; — содержит текст, который будет выведен после запуска события OnHint . Значением этого свойства является текст подсказки Hint того визуального компонента, над которым в данный момент перемещается курсор мыши. Это свойство можно использовать, например, для отображения подсказки в строке состояния приложения.
  2. property ShowHint: Boolean; — установка свойства равным False отключает систему подсказок для всех элементов в приложении независимо от их индивидуальных установок.
  3. property HintColor: TColor; — определяет цвет окна всплывающей подсказки. По умолчанию это цвет clInfoBk (желтый), но его можно изменять программно.
  4. property HintPause: Integer; — задает время (в миллисекундах) перед выводом окна подсказки (значение по умолчанию — 500 миллисекунд или половина секунды).
  5. property HintHidePause: Integer; — задает время (в миллисекундах) перед закрытием окна подсказки (значение по умолчанию — 2500 миллисекунд или две с половиной секунды).
  6. property HintShowPause: Integer; — задает время (в миллисекундах) перед отображением окна подсказки, если активна подсказка другого элемента (значение по умолчанию — 50 миллисекунд). Это свойство позволяет предотвратить появление неприятного мерцания, если пользователь быстро перемещает мышь над разными компонентами.
  7. property Icon: TIcon; — позволяет изменить пиктограмму, представляющую приложение в панели задач во время работы. Это полезно, если необходимо отмечать, таким образом, изменение состояния приложения. Следующий код назначает пиктограмму из файла INACTIVE.ICO :

Рис.1. Вкладка Application

Свойство может изменяться программно, например, изменяя надпись в зависимости от режима работы приложения.

  • property MainForm: TForm; — задает главную форму приложения.
  • property ShowMainForm: Boolean; — определяет, должна ли главная форма быть видимой в момент запуска приложения на выполнение. По умолчанию оно равно True , что обеспечивает видимость главной формы в момент начала работы приложения. Если установить это свойство в False до вызова метода Application.Run и, если при этом свойство Visible главной формы тоже равно False , то главная форма в первый момент будет невидимой.
  • property HelpFile: string; — указывает файл справки, который используется в приложении в данный момент как файл по умолчанию. Если это свойство не изменяется во время выполнения приложения, то оно равно опции Help File , задаваемой во время проектирования на странице Application окна опций проекта. Свойство можно изменять программно, назначая в зависимости от режима работы приложения тот или иной файл справки.
  • Методы класса TApplication

    Рассмотрим некоторые методы объекта Application . Методы Initialize — инициализация объекта, и Run — запуск выполнения приложения, включаются в каждый проект автоматически. Это можно увидеть в файле проекта (пункт меню Project | View Source ). Там же размещается метод создания форм CreateForm для всех автоматически создаваемых форм проекта. Общий вид этого метода следующий:

    При выполнении метода:

    Метод Terminate завершает выполнение приложения. Если нужно завершить приложение из главной формы, то вместо метода Application.Terminate можно использовать метод Close главной формы. Но если требуется закрыть приложение из какой-нибудь вторичной формы (например, из окна диалога), то нужно применить метод Application.Terminate .

    Метод Minimize сворачивает приложение, помещая его пиктограмму на панель задач. Метод Maximize разворачивает приложение на весь экран.

    События класса TApplication и их обработка

    Объект класса TApplication создается только при выполнении приложения, значит на этапе разработки приложения все его события недоступны. Поэтому нельзя использовать Инспектор объектов (Object Inspector) для создания обработчиков событий. Однако в некоторых случаях требуется создавать обработчики событий этого класса. Приведем общий способ создания обработчиков событий класса TApplication .

    Сначала опишем обработчик события. Поскольку событие распознается и запускается объектом, обработчик должен быть методом объекта. Он также должен соответствовать соглашению о вызовах события, которое обычно описано в справочной системе. Например, из файлов справки можно узнать, что событие OnActivate типа TNotifyEvent является наиболее общим типом. Его описание выглядит так:

    Это описание говорит о том, что обработчик должен получать параметр TObject , который позволяет определить, какой именно объект распознал и отослал событие.

    Создадим новое приложение и модифицируем описание TForm1 :

    Описание обработчика как protected не несет особой нагрузки и принято по умолчанию. Важно лишь, чтобы он был методом класса.

    Теперь, когда мы описали обработчик, определим его. Для этого нужно поместить код этого обработчика в раздел implementation модуля:

    При выполнении этого обработчика на экран выводится диалоговое окно с сообщением: Привет всем. , кнопкой OK и картинкой с символом i .

    Наконец, назначим обработчик событию. Обычно это выполняется в событии OnCreate главной формы. Измените обработчик события OnCreate класса TForm1 следующим образом:

    Эта конструкция означает, что при возникновении события Application.OnActivate будет выполняться процедура OnActivateHandler .

    В результате выполнения этого приложения на экране будет следующая «картинка»:

    Рис.2. Внешний вид приложения

    Текст этого примера можно взять здесь.

    На следующем шаге мы продолжим рассматривать обработку событий класса TApplication , в частности, познакомимся с компонентом ApplicationEvents .

    ExtractFileDrive — Функция Delphi

    Внимание! Эти функции работают со строками, представляющими из себя имена файлов. И результы их работы — тоже строки. Физически с файлами они ничего не делают.

    Таблица стандартных процедур и функций для работы с именами файлов
    Наименование Описание
    ChangeFileExtention функция Изменяет расширение файла.
    DosPathToUnixPath функция Конвертирует путь, заданный в спецификации DOS в путь по спецификации Unix.
    ExcludeTrailingBackslash функция Возвращает путь без символов разделителей пути («\» — для Windows и «/» — для Linux). Эта функция включена для совместимости со старыми версиями. Новые программы должны использовать ExcludeTrailingPathDelimiter.
    ExcludeTrailingPathDelimiter функция Возвращает путь без символов разделителей пути («\» — для Windows и «/» — для Linux).
    ExpandFileName функция Возвращает полный путь для имени файла, заданного относительно, без учета регистра.
    ExpandFileNameCase функция Возвращает полный путь для имени файла, заданного относительно, с учетом регистра.
    ExpandUNCFileName функция Возвращает полный путь для имени файла в формате Universal Naming Convention для сетевых файлов, если это возможно.
    ExtractFileDir функция Возвращает полное (включая имя диска) имя дирректории, в которой расположен файл.
    ExtractFileDrive функция Возвращает имя диска.
    ExtractFileExt функция Возвращает расширение файла.
    ExtractFileName функция Возвращает имя файла с расширением.
    ExtractFilePath функция Возвращает полный путь к файлу.
    ExtractRelativePath функция Возвращает относительное имя файла относительно заданной базовой директории.
    ExtractShortPathName функция Конвертирует полное имя файла в короткую 8.3 форму. Например: «C:\Program Files\MyCompany\MyApp\MyApp.exe» будет преобразовано в «C:\Progra

    1\MyApp\MyApp.exe».

    IncludeTrailingBackslash функция Включает в путь символы разделителей пути («\» — для Windows и «/» — для Linux). Эта функция включена для совместимости со старыми версиями. Новые программы должны использовать IncludeTrailingPathDelimiter.
    IncludeTrailingPathDelimiter функция Включает в путь символы разделителей пути («\» — для Windows и «/» — для Linux).
    IsPathDelimiter функция Показывает являектся ли символ в указазанной позиции символом разделителя пути («\» — для Windows и «/» — для Linux).
    MatchesMask функция Показывает удовлетворяет ли конкретное имя файла формату, заданному в маске.
    MinimizeName функция Укорачивает полное имя файла так, чтобы оно поместилось в ограниченную область вывода. Если полное имя файла превышает область вывода, MinimizeName заменяет часть пути точками так, чтобы имя файла вписалось в заданные рамки.
    ProcessPath процедура Раскладывает полное имя файла по полочкам, вычленяя: имя диска, путь к файлу, короткое имя файла с расширением.
    UnixPathToDosPath функция Конвертирует путь, заданный в спецификации Unix в путь по спецификации DOS.

    Список литературы:

    1. Delphi7 Help


    Как узнать директорию исполняемого файла?

    10.07.2010, 22:11

    Узнать имя исполняемого файла, не программы
    Здравствуйте! Обрисую ситуацию: есть у меня файл Maidan.lol, запуск его производится с помощью.

    Как определить версию исполняемого файла?
    Как определить версию файла? P.S. Файл в это время исполняется (exe)

    Как уменьшить размер исполняемого файла, созданного в Delphi 7 (как использовать KOL)
    Здравствуйте! Подскажите, пожалуйста, как уменьшить размер исполняемого файла, созданного в Delphi.

    Как при сохранении файла создавать директорию, если она не существует?
    Хочу записать файл (SaveToFile) в директорию, предварительно создав эту директорию

    Запуск исполняемого файла
    Помогите пожалуйста, есть вот такой код: unit Unit1; interface uses Windows.

    10.07.2010, 22:17 2 10.07.2010, 22:25 3

    Решение

    10.07.2010, 22:46 [ТС] 4

    Хохол
    Данная функция возвращает путь к самому файлу, а мне нужен путь к каталогу в которой расположен файл.

    Добавлено через 13 минут
    Oleg
    А вот это ТЕМА. Спасибо большое!!

    03.12.2012, 11:47 5

    Хохол
    Данная функция возвращает путь к самому файлу, а мне нужен путь к каталогу в которой расположен файл.

    Добавлено через 13 минут
    Oleg
    А вот это ТЕМА. Спасибо большое!!

    SysUtils ExtractFileDir Иизвлекает из полного имени файла название папки
    SysUtils ExtractFileDrive Извлекает из полного имени файла название диска
    SysUtils ExtractFileExt Извлекает из полного имени файла его расширение
    SysUtils ExtractFileName Извлекает из полного имени файла краткое имя файла
    SysUtils ExtractFilePath Извлекает из полного имени файла название патча
    SysUtils FileAge Получение датя/время последнего изменения файла, не открывая его
    SysUtils FileDateToDateTime Конвертирует формат даты/времени файла в значение TDateTime
    SysUtils FileExists Возвращает True если указанный файл существует
    SysUtils FileGetAttr Выдаёт атрибуты файла

    Функции Delphi модуля SysUtils

    Модуль SysUtils

    Предлагаем список функций модуля SysUtils, используемого в среде разработки Delphi.

    AnsiCompareStr Сравнение двух строк на равенство
    AnsiCompareText Сравнение двух строк на равенство
    AnsiLowerCase Символы верхнего регистра изменяются в строку со строчными буквамм
    AnsiPos Находит позицию одной строки в другой
    ChangeFileExt Изменяет расширение имени файла
    CompareStr Сравнивает две строки, чтобы увидеть, какая из них больше
    CompareText Сравнивает две строки, игнорируя регистр
    CreateDir Создаёт директорию
    CurrToStr Преобразует денежную величину в строку
    CurrToStrF Преобразует денежную величину в строку с форматированием
    Date Возвращает текущую дату
    DateTimeToFileDate Преобразует значение TDateTime в формат date/time формат файла
    DateTimeToStr Конвертирует значение даты и времени TDateTime в строку
    DateToStr Преобразует значение даты TDateTime в строку
    DayOfWeek Выдает индекс дня недели для значения TDateTime
    DeleteFile Удаляет файл, указанный в параметре
    DirectoryExists Возвращает true, если указанная директория существует
    DiskFree Выдает число свободных байтов на указанном диске
    DiskSize Выдает размер указанного диска в байтах
    EncodeDate Формирует значение TDateTime из значений года, месяца и дня
    EncodeTime Формирует значение TDateTime из значений часа, минуты, секунды и миллисеккунды
    ExtractFileDir Извлекает из полного имени файла название папки
    ExtractFileDrive Извлекает из полного имени файла название диска
    ExtractFileExt Извлекает из полного имени файла его расширение
    ExtractFileName Извлекает из полного имени файла краткое имя файла
    ExtractFilePath Извлекает из полного имени файла название патча
    FileAge Получение дата/время последнего изменения файла, не открывая его
    FileDateToDateTime Конвертирует формат даты/времени файла в значение TDateTime
    FileExists Возвращает True если указанный файл существует
    FileGetAttr Выдаёт атрибуты файла
    FileSearch Поиск файла в одной или более папках
    FileSetAttr Устанавливает атрибуты файла
    FindClose Закрывает успешный FindFirst поиск файла
    FindCmdLineSwitch Определяет, был передан некоторый параметр выключатель
    FindFirst Находит все файлы, соответствующие маске файла и атрибутов
    FindNext Находит следующий файл после успешного FindFirst
    FloatToStr Преобразует значение с плавающей запятой в строку
    FloatToStrF Преобразует значение с плавающей запятой в строку с форматированием
    ForceDirectories Создаёт новый путь каталогов
    Format Богатое форматирование чисел и текста в строке
    FormatCurr Богатое форматирование значений валюты в строку
    FormatDateTime Богатое форматирование переменной TDateTime в строку
    FormatFloat Богатое форматирование числа с плавающей запятой в строку
    GetCurrentDir Возвращает текущий каталог (диск плюс каталог)
    IncMonth Увеличивает TDateTime переменную на некоторое число месяцев
    IntToHex Преобразует целое число в шестнадцатеричную строку
    IntToStr Конвертирует целое число в строку
    IsLeapYear Возвращает True, если данный календарный год високосный
    LastDelimiter Находит последнюю позицию указанных символов в строке
    LowerCase Изменяет символы верхнего регистра в строке в строчные буквы
    Now Выдает текущую дату и время
    RemoveDir Позволяет удалить директорию
    Rename Переименовка фала
    RenameFile Переименование файла или директории
    SetCurrentDir Изменяет текущую директорию
    StrScan Ищет заданные символы в строке
    StrToCurr Преобразует числовую строку в денежное выражение
    StrToDate Конвертирует строку с датой в значение типа TDateTime
    StrToDateTime Конвертирует строку с датой и временем в значение типа TDateTime
    StrToFloat Преобразует числовую строку в значение с плавающей запятой
    StrToInt Преобразует строку с целым значением в Integer
    StrToInt64 Преобразует строку с целым значением в Int64
    StrToInt64Def Преобразует строку с целым значением в Int64, учитывая значение по умолчанию
    StrToIntDef Преобразует строку с значение с типом Integer, учитывая значение по умолчанию
    Time Возвращает текущее время
    TimeToStr Конвертирует значение времени типа TDateTime в строку
    Trim Удаляет начальные и конечные пробелы в строке
    TrimLeft Удаляет начальные пробелы в строке
    TrimRight Удаляет конечные пробелы в строке
    UpperCase Изменяет символы в строке из нижнего регистра в верхний
    WrapText Добавьте перенос строки в строку, чтобы имитировать перенос слов
    Abort Прерывает обработку команд и выходит к последнему исключительному блоку
    AppendStr Конкатенация одной строки в конец другой
    Beep Делает звук гудка
    DateTimeToString Огромные возможности форматирования даты в строку
    DecodeDate Извлекает значения года, месяца, дня из TDateTime переменной
    DecodeDateTime Разбивает TDateTime переменную на ее части даты/времени
    DecodeTime Разбивает значение TDateTime на отдельные значения времени
    FreeAndNil Освобождение памяти объекта и установка его в nil
    FreeMem Освобождает память, используемую переменной
    GetLocaleFormatSettings Получает региональные значения для безопасных потоков функций.
    ReplaceDate Изменяет только часть даты TDateTime переменной
    ReplaceTime Изменяет только часть времени TDateTime переменной

    Адрес и имя файла

    Тип Variant

    Бывают случаи, когда на этапе программирования мы еще не можем четко определить тип данных определенной переменной. В таком случае можно воспользоваться очень мощным типом Variant . Этот тип вводился в Delphi для поддержки технологии OLE ( Object Link and Embedding – внедрение и связь объектов). Такая технология широко используется в Windows для обмена данными между приложениями различного типа. С помощью OLE происходит вставка таблицы MS Excel в редактор текстов MS Word , или картинка из Paint легко вставляется в тот же редактор. В этой технологии Variant используется на каждом шагу, однако ему можно найти применение и в других случаях.

    Переменные типа Variant могут принимать значения любого типа! Вы присваиваете такой переменной что угодно, а программа сама определяет ее тип на этапе выполнения. Давайте рассмотрим пример:

    В этом примере во время выполнения программы тип переменной изменится 4 раза, и код выполнится корректно. Когда программа встречает тип Variant , она автоматически выделяет под нее память . Если значение не задано, переменной присваивается ноль.

    Совет: старайтесь использовать тип Variant только там, где это действительно необходимо! За удобство использования такой переменной тоже приходится платить. Переменная такого типа занимает значительно больше памяти, чем переменная любого другого типа. Процессору мы тоже задаем лишнюю работу, ведь сначала нужно определить тип данных в переменной, затем присвоить этот тип самой переменной, и т.п. Кроме того, переменные типа Variant очень сложно отлаживать в больших программах. Складывая, к примеру, строку и целое число , вы можете получить совсем не тот результат, который ожидали!

    Как вы считаете, какой результат окажется в конце концов в переменной v1 ? На первый взгляд, результат очевиден: число 16. Однако не спешите с выводами. Когда операторы вычисления имеют равный приоритет, они выполняются слева – направо. В данном примере вначале объединятся строки, в результате чего получится строка «15». Затем эта строка преобразуется в целое число , и к нему будет прибавлено число 10. Поэтому результат сложения – число 25.

    Функции для работы с именем файла

    Любая серьезная программа обязательно работает с каким-либо файлом, или даже с множеством файлов. Программы для работы с базами данных напрямую связаны с таблицами и индексами, которые представляют собой файлы различных форматов, редакторы текста работают с текстовыми файлами, а графические редакторы – с графическими. Все эти программы могут работать с настроечными файлами – файлами, в которых программа сохраняет пользовательские настройки, а при загрузке считывает их.

    Там, где приходится работать с файлами, требуется уметь обрабатывать и имя файла : вычленять только имя или только адрес файла, диск , на котором файл находится, или расширение имени файла . Ниже представлен список функций, которые позволяют решить все эти задачи.

    Функция ExtractFileName()

    Функция возвращает имя файла без имени диска и каталогов, извлекая его из полного имени файла FileName . В качестве параметра указывается полный путь и имя файла .

    Функция ExtractFilePath()

    Функция возвращает путь к файлу, извлекая его из полного имени файла. Если имя файла не содержит ни имя каталогов, ни имя диска, то функция возвращает пустую строку. Подобное же действие выполняет функция ExtractFileDir() . Отличие этих функций в том, что в конце возвращаемого адреса функции ExtractFilePath() есть знак «\», а функция ExtractFileDir() этот знак не устанавливает:

    Функция ExtractShortPathName()

    Функция конвертирует длинное имя файла в DOS-формат, так называемый, 8.3. Этот формат подразумевает, что имя файла или папки может быть длиной максимум 8 символов, а затем, после точки, может присутствовать расширение имени файла из 3-х символов. Если имя папки (файла) имеет больше символов, оно будет обрезано до 8 символов.

    Если указанный файл или каталог не существует, то функция возвращает пустую строку. Параметр может представлять собой полное имя файла. Если указанный файл не существует, то функция возвращает пустую строку. Пример:

    Процедура ProcessPath()

    Процедура анализирует полное имя файла и возвращает отдельно имя диска, каталог и имя файла . Если файл не существует, то возникает ошибка. Когда полное имя файла содержит больше одного каталога, также возникает ошибка.

    Функция ExtractFileDrive()

    Функция возвращает имя диска, извлеченное из полного имени файла. Если указанное имя файла не содержит имя диска, то функция возвращает пустую строку. Для имени в UNC формате (сетевое имя) возвращается строка в формате ‘\\ \ ‘.


    Функция ExtractFileExt()

    Функция возвращает расширение файла, имя которого указано в параметре. Результирующая строка включает в себя символ точки и символы расширения файла. Если указанное имя файла не имеет расширения, то функция возвращает пустую строку. Пример:

    Пишем программу

    Чтобы усвоить, как работают эти функции, создадим новое приложение . Форму сразу переименуйте в fMain , а проект сохраните под названием fname в отдельной папке. На форму установите Edit , здесь будет отображаться полное имя файла . Сразу под ней установите Label , тут будет отображаться результат работы функций. Очистите текст и у Edit и у Label . Ниже бросьте на форму кнопку, и напишите на ней «Открыть файл «. Рядом с ней бросьте OpenDialog , он нам понадобится для открытия нужного файла. Еще ниже сгруппируйте 6 кнопок, на которых напишите:

    How to check if path points to a root folder using Delphi

    What is the best/easiest way to check if a certain path points to a drive’s root?

    I guess I could just check if path name ends with ‘\’ or ‘:’, or if the path is only 2 or three characters in length, but I was hoping there was some kind of standard «IsDriveRoot» function to check this.

    After searching through the Delphi help file I found the ExtractFileDrive() function which returns the drive portion of any given path.

    Using that function I gues it’s easy to write a little function to check if the original path is the same as the result of ExtractFileDrive(), which would mean that the original path had to be the drive’s root.

    Something like that should do it.

    I actually think the second example is simpler, and will probably end up using that one.

    ExtractFileDrive Routine

    Description

    (Please provide a description in your own words. It is illegal to use the wording from the Delphi Help.)

    Technical Comments

    (Known issues / Documentation clarifications / Things to be aware of)

    Examples

    (Please provide links to articles/source code that show how to use this item.)

    See Also

    (Please provide links to items specifically related to this item.)

    User Comments/Tips

    (Please leave your name with your comment.)

    Как проверить, если путь указывает на корневой папки с помощью Delphi

    Что такое лучший / простой способ проверить, если определенный путь указывает на корень накопителя?

    Я предполагаю, что я мог бы просто проверить, если имя пути завершается «\» или «:», или если путь только два или три символа в длине, но я надеялся, что там было какое-то стандартная функция «IsDriveRoot», чтобы проверить это.

    После поиска в файле справки Delphi Я нашел ExtractFileDrive () функцию , которая возвращает приводную часть любого заданного пути.

    Используя эту функцию, я догадывался, что это легко написать небольшую функцию, чтобы проверить, если исходный путь совпадает с результатом ExtractFileDrive (), что будет означать, что исходный путь должен быть корнем накопителя.

    Нечто подобное должно делать это .

    Я на самом деле думаю, что второй пример проще, и, вероятно, в конечном итоге, используя эту.

    ExtractFileDrive — Функция Delphi

    Текстовый файл отличается тем что он разбит на разные по длине строки, отделенные символами #13#10. Есть 2 основных метода работы с текстовыми файлами — старый паскалевский способ и через файловые потоки. У обоих есть преимущества и недостатки. Через потоки способ проще поэтому начнем с него.

    Итак у всех потомков класса TStrings (TStringList, memo.Lines и т.п. ) есть методы записи и чтения в файл — SaveToFile, LoadFromFile. Преимущество — простота использования и довольно высокая скорость, недостаток — читать и писать файл можно только целиком.

    1. Загрузка текста из файла в Memo:

    2. Сохранение в файл:

    3. А вот так можно прочитать весь файл в строку:

    Паскалевский метод доступа

    Для более тонких операций над текстовыми файлами прийдется освоить очень древний паскалевский способ.

    Итак, для доступа к текстовым файлам используется переменная типа TextFile. До сих пор не совсем понимаю что это такое физически — что-то типа «внутреннего» паскалевского Handle на файл.

    Итак чтобы ассоциировать файл на диске с переменной надо проделать следующие опрерации:

    1) Определяем файловую переменную:

    2) Ассоциируем ее:

    3) Теперь надо этот файл открыть, есть 3 варианта:

    1. файла нет или он должен быть перезаписан, открытие для записи: Rewrite(f)
    2. файл есть и его надо открыть для чтения (с первой строки): Reset(f)
    3. файл есть и его надо открыть для дописования строк в конец: Append(f)


    Как видите не хватает очень полезных функций таких как открытия файла для чтения с произвольной строки и для записи в файл произвольной строки. Но надо учесть, что так как длины строк разные, не существует никакого способа узнать физическое место начала например 1000 строки, не прочитав всю тысячу строк. Для записи ситуация еще сложнее — вставить строку означает перезаписать всю информацию после этой строки заново. Таким образом варианты только следующие:

    • Перезаписать весть файл
    • Читать с первой строки
    • Дописать что-то в конец
    • Читать и писать файл целиком (см. выше работу через TStrings)

    В конце работы открытый файл нужно закрыть:

    Теперь пусть у нас есть строковая переменная s для чтения строки из файла

    Чтение предварительно открытого файла:

    ReadLn(f, s) — будет прочитанна текущая строка и позиция чтения переведена на следующую позицию.

    А как прочитать весь файл?

    Хорошо, а если файл несколько метров есть ли способ поставить какой-нибудь ProgressBar или Gauge чтобы показывал сколько считанно? Есть, но не совсем прямой — не забыли, сколько строк в файле заранее мы не знаем, узнать можно только прочитав его весь, но показометер мы все-таки сделаем:

    Теперь комментарии к коду.

    1. Функию GetFileSize я рсссмотрю после, она немного по другому подходит к чтению файла (кстати я знаю еще по крайней мере 3 способа ее реализации, поэтому не нужно указывать что это можно сделать легче, быстрее или просто по другому — просто давайте разберем это позже)
    2. Переменная i — все время указывает на количество байт которое мы считали — мы определяем длину каждой строки и прибавляем 2 (символы конца строки). Зная длину файла в байтах и сколько байт прочитано можно оценить и прогресс, но
    3. Если ставить изменение прогресса после каждой строки, то это очень сильно тормознет процесс. Поэтому вводим переменную j и обновляем прогресс например 1 раз на 1000 прочитанных строк
    4. Переменная Canceled — глобальная переменная. Поставьте на форму кнопку, в обработчике нажатия поставьте Canceled:=True; и нажатие кнопки прервет чтение файла.

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

    Запись целой строки:

    Запись кусочка строки(те следующая операция записи будет произведена в ту же строку):

    Если переменная s содержит больше 255 символов (т.е. является длинной строкой), то таким способом ни фига не запишится, в файл вместо строки попадут 4 байта указателя на нее. Надо делать так:

    Работа через WinAPI

    Раздел написан Podval (примеры к сожалению на С++)

    Любителям WinAPI посвящается. Функции FileOpen, FileSeek, FileRead. Возьмем форму, положим на нее кнопку, грид и Опен диалог бокс. Это для Билдера, но какая нам в данном случае разница?

    Потренируемся еще. Функции FileExists, RenameFile, FileCreate, FileWrite, FileClose. Бросим на форму Save dialog box.

    (с) Оба примера взяты из хелпа по Borland C++ Builder 5.

    Первоисточник тот же.

    Может быть, такая функция полезна будет, хотя о программном поиске файлов и так много наговорено. Но на всякий случай, как говорится.

    В этом примере идет поиск в текущем каталоге и каталоге Windows

    В дополнение к Дате/Времени

    Для конвертации возвращаемого значения в TDateTime:

    Теперь разберем типизированные файлы. Типизированный файл — это файл в котором записанны идентичные структуры. Например любой файл можно считать файлом байтов — т.е. можно его читать байт за байтом, можно перейти сразу к любому байту по его номеру, можно сразу узнать сколько байт в файле, можно заменить любой байт на другой не перезаписывая файл. Теперь все это в примерах:

    Объявляем файл байтов:

    Ассоциируем файловую переменную с физическим файлом:

    Теперь мы можем либо перезаписать/создать файл:

    Либо открыть существующий для чтения и записи:

    Обратите внимание, что функция Reset хотя и имеет такой же формат как и для текстовых файлов, но открытый ей файл можно и читать и писать, в отличие от текстовых.

    Теперь функции работы с файлом:

    Все эти функции не работают с файлами большими 2 Gb.

    После работы файл надо закрыть:

    Приведенные выше механизмы будут работать с любым файлом, так как любой файл можно считать файлом байтов. Теперь где это можно использовать? В принципе везде, но в подавляющем большинстве случаев это будет очень неудобно, ведь скорость считывания при чтении по байтам будет на порядки более низкой чем другими способами. Однако в некоторых случаях этот способ может быть очень полезен. Например в программе вам надо заменить 100й байт файла на другой, или прочитать 100й байт файла, например во всяких читерских программах, при взломе и т.п. Здесь такой доступ будет весьма удобен. Гораздо более интересным представляется дальнейшее развитие технологии типизированных файлов (их еще лет 15 назад называли «Файлы прямого доступа»). Представим себе, что файл состоит не из байт а из более сложных структур. Например мы имеем некоторую информацию в виде:

    Обратите внимание, что все элементы записи точно типизированны, нет ни длинных строк, ни открытых массивов, ни объектов, другими словами, заранее точно известно сколько именно байт будет занимать переменная этого типа. Объявим переменную этого типа:

    и файл этого типа:

    Теперь мы можем читать и писать сразу целую структуру, абсолютно так же как и если бы это был один байт:

    Все остальные функции приведенные в предыдущей статье будут работать так же, только одно отличие — Seek и Size оперируют не с количеством байт, а с количеством записей.

    Идем дальше. Есть такое понятие как нетипизированный файл. Это такой файл который содержит разнородные элементы. Например файл EXE — вначале он имеет заголовок, затем двоичный код, в конце какие-то ресурсы. Все части файла имеют разную длину и разную структуру. Тут уже обратится к произвольному элементу сложно, обычно надо вначале узнать где этот элемент находится, подчас это записано в предыдущем куске информации. Работа с такими файлами достаточно сложна и требует вручную разработки алгоритмов его чтения, но в связи гибкостью структуры и компактностью такие файлы составляют большинство. Для работы с нетипизированными файлами используют процедуры BlockRead и BlockWrite, которые позволяют читать/писать произвольное количество байт. Привожу пример пользования этими функциями из справки по Дельфи:

    Этот код копирует из одного файла в другой. Замечания по поводу этого метода работы с файлами — плюсы — очень высокая скорость, особенно если размер буффера увеличить до 64kb-512kb, что позволит считывать файл достаточно большими кусками, чтобы обеспечить отсутствие простоев винчестера, к тому же обеспечивается очень высокая гибкость в работе. Минусы — сложность разработки, необходимость вручную писать все детали механизма чтения/записи и интерпретации данных.


    Пожалуй на этом можно было бы и завершить описание работы с файлами средствами Паскаля и файловых переменных, но заглянув в Help Дельфей я обнаружил еще несколько функций достойных упоминания.

    Теперь разберем возможности работы потомка TStream — TFileStream — файловый поток. Этот класс был специально введен для работы с файлами. Для работы с файловым потоком Вам надо записать в Uses модули classes, Sysutils (classes — включает в себя собственно определение класса, Sysutils — некоторые константы необходимые для работы).

    Вот пример записи/перезаписи файла:

    Теперь небольшой разбор:

    TFileStream.create — конструктор класса, его вызов требует указания имени файла и опций его открытия, следующие опции определены:

    Теперь метод Write — этим методом в файл пишется любая информация из буфера любого типа, Вам надо указать только буффер и количество записываемых байтов. В данном случае используется переменная типа String в качестве буффера, но так как для длинных строк она представляет собой лишь указатель, то конструкция «pointer(s)^» заставляет обращаться именно к ее содержимому.

    А вот этот код демонстрирует чтение файла с использованием файлового потока:

    И пояснения к коду:

    1. Никаких проверок длину файла и его наличие здесь не делается — это демонстрационный код, а не готовая процедура чтения.
    2. Файл мы считываем в буффер типа PChar (с тем же успехом можно использовать массив или любой другой контейнер). Для тех кто не помнит — процедуры GetMem(p, 255) и FreeMem(p) — распределение памяти для строки и освобождение памяти.
    3. Метод потока Seek позволяет установить текущую позицию считывания/записи файла. Первый параметер — номер байта, второй — это от чего считать этот байт (у нас считать от начала файла), возможны варианты:
      • soFromBeginning — от начала файла
      • soFromCurrent — от текущей позиции считывания
      • soFromEnd — от конца файла (в этом случае номер байта должен быть отрицательным или равным нулю)
    4. Собственно считывание из потока осуществляется методом read, в котором указывается в качестве параметров буфер в который мы читаем и желаемое количество байт для чтения. Метод read является функцией, которая возвращает количество байт реально прочитанных из потока.

    Заканчивая о файловых потоках хочу упомянуть о методе

    CopyFrom который позволяет перекачивать информацию из одного потока в другой и о свойствах:

    Size — размер файла
    Position — текущая позиция чтения/записи потока

    Работа с файловыми потоками весьма быстра, этот класс, являсь классом VCL, в то же время базируется на низкоуровневых функциях Windows, что обеспечивает очень высокую скорость работы и стабильность операций. К тому же многие компоненты и классы VCL поддерживаю прямое чтение и запись с файловыми потоками, что занчительно упрощает работу — например TStringList, TBlobField, TMemoField и другие.

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

    Работа через Handle

    Еще один способ работы с файлами — это открытие Handle на файл и работу через него. Тут есть 2 варианта — можно использовать функции Дельфи или использовать WinAPI напрямую.

    При использовании функций Дельфи можно применять следующие функции:

    FileOpen(FileName, fmOpenWrite or fmShareDenyNone) — функция открывает файл и возвращает целое цисло — Handle на файл. Параметры функции — имя файла и тип доступа (все типы доступа я перечислил ранее). Если файл успешно открыт то Handle должен быть положительным цислом, отрицательное число — это код ошибки.

    Во всех остальных функциях используется именно значение Handle, возвращаемое этой функцией.

    FileClose(Handle: Integer) — закрывает файл

    FileRead(Handle: Integer; var Buffer; Count: Integer): Integer;
    FileWrite(Handle: Integer; const Buffer; Count: Integer): Integer;

    Эти функции для чтения/записи файла, где Buffer любая переменная достаточного размера для чтения/записи куска информации (обычно типа PChar или массив), Count-количество байт, которое Вы желаете записать/прочитать. Функции возвращают количество байт которые реально были прочитанны или записаны.

    Этот тип доступа к файлам применяется весьма редко. Дело в том что он практически дублирует соответствующие функции WinAPI и к тому же обычно работает несколько медленнее, чем например потоки. И все же использование функций FileOpen и FileClose не лишено привлекательности. Наряду с тем что эти функции намного легче в использовании соответствующих функций WinAPI (можете сравнить — FileOpen имеет 2 параметра, cooтветствующая функция WinAPI — CreateFile имеет 7 параметров, большая часть из которых реально требуется лишь в ограниченном числе случаев) этот путь доступа открывает возможность прямого использования всех функций WinAPI про работе с файлами, которые требуют Handle на открытый файл.

    Дельфи предоставляет довольно широкие возможности по файловым операциям без использования механизмов открытия/закрытия файлов.

    Вот список наиболее употребимых функций, большинство из которых в фачкстве параметров нуждаются только в имени файла:

    ChDir(NewCurrentPath: string); — изменяет текущий каталог (в среде Windows сие конечно не так актуально как в ДОС, но все же), прочитать же текущий каталог можно функцией GetCurrentDir, а текущий каталог для определенного драйва — GetDir.

    CreateDir(const Dir: string): Boolean; — создает каталог. При этом предыдущий уровень должен присутствовать. Если вы хотите сразу создать всю вложенность каталогов используйте функцию ForceDirectories(Dir: string): Boolean; Обе функции возвращают True если каталог создан

    DiskFree(Drive: Byte): Int64; — дает свободное место на диске. Параметер — номер диска 0 = текущий, 1 = A, 2 = B, и так далее

    DiskSize(Drive: Byte): Int64; — размер винта. Обратите внимание на то что для результата этой и предыдущей функций абсолютно необходимо использовать переменную типа Int64, иначе макимум того что вы сможете прочитать правильно будет ограничен 2Gb

    FileExists(const FileName: string) — применяется для проверки наличия файла

    FileGetAttr(const FileName: string): Integer;
    FileSetAttr(const FileName: string; Attr: Integer): Integer; — функции для работы с атрибутами файлов. Вот список возможных атрибутов:

    RemoveDir(const Dir: string): Boolean; — удаляет папку(пустую)
    DeleteFile(const FileName: string): Boolean; — удаляет файл
    RenameFile(const OldName, NewName: string) — переименовывает файл

    Информация о файле

    Привожу пример функции которая собирает довольно большое количество информации о выбранном файле:

    Скорее всего эта функция как есть вряд ли понадобится, так как наверняка бОльшее количество определяемых параметров избыточно, тем ни менее может кому пригодится как пример выяснения информации о файле.

    Теперь поговорим о поиске файлов. Для этой цели могут использоваться процедуры FindFirst, FindNext, FindClose, при участии переменной типа TSearchRec которая хранит информацию о текущем статусе поиска и характеристики последнего найденного файла.

    Пример иллюстрирующий поиск всех файлов и каталогов в определенном каталоге:

    Как проверить, указывает ли путь к корневой папке с помощью Delphi

    Каков наилучший / самый простой способ проверить, указывает ли определенный путь на корень диска?

    Я думаю, я мог бы просто проверить, заканчивается ли имя пути на «\» или «:», или если длина пути составляет всего 2 или три символа, но я надеялся, что есть какая-то стандартная функция «IsDriveRoot», чтобы проверить это.

    После поиска в файле справки Delphi я обнаружил функцию ExtractFileDrive (), которая возвращает часть диска любого заданного пути.

    Используя эту функцию, я догадываюсь, что легко написать небольшую функцию, чтобы проверить, совпадает ли исходный путь с результатом ExtractFileDrive (), что будет означать, что исходный путь должен быть корневым для диска.

    Что-то подобное должно сделать это .

    Я на самом деле думаю, что второй пример проще, и, вероятно, в конечном итоге использовать тот.

    Илон Маск рекомендует:  Олимпиады по информатике
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL