Bazaprogram.ru

Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Delphi проверка существования файла

Delphi проверка существования файла

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

procedure TForm1.StartProgram(Sender: TObject);
begin
IniFileName := ExtractFileDir(ParamStr(0)) + «test.ini»;
IniFile := TIniFile.Create(IniFileName);
if(IniFile.SectionExists(«General»)) then ReadINIFile
else SaveINIFile
end;


Думкин ( 2003-09-30 08:47 ) [1]

А зачем так?
Если настроечного файла с настройками нет еще — есть значения по умолчанию.


DimChan ( 2003-09-30 08:54 ) [2]

А не проще настройки хранить/создавать в Реестре?


Verg ( 2003-09-30 09:04 ) [3]


> procedure TForm1.StartProgram(Sender: TObject);
var ife : boolean;
> begin
> IniFileName := ExtractFileDir(ParamStr(0)) + «test.ini»;
ife:=FileExists(IniFileName);
> IniFile := TIniFile.Create(IniFileName);
> if ife then ReadINIFile
> else SaveINIFile
> end;


> Думкин © (30.09.03 08:47) [1]
> А зачем так?
> Если настроечного файла с настройками нет еще — есть значения
> по умолчанию.

Да, но файл-то так и не задастся.
Иногда надо бывает, чтобы прога создала INI файл со всеми нужными разделами и значениями именно по умолчанию, если этого INI не было.


Кулюкин Олег ( 2003-09-30 09:08 ) [4]

> Нужно проверить, есть файл с настройками или нет
Если надо проверить существование файла:

function FileExists(const FileName: string): Boolean;

FileExists returns True if the file specified by FileName exists. If the file does not exist, FileExists returns False.


ads ( 2003-09-30 09:10 ) [5]

By the way:
FileExists(*.*) — вернет TRUE.
— это отвратительно.


Palladin ( 2003-09-30 09:16 ) [6]


Verg ( 2003-09-30 09:22 ) [7]


> ads (30.09.03 09:10) [5]
> By the way:
> FileExists(*.*) — вернет TRUE.
> — это отвратительно.

Del *.* — сработает, что тоже гадко.


Verg ( 2003-09-30 09:42 ) [8]

Кстати, если уж говорить о приколах FileExists, то стоит отметить лишь одно — файлы с датой ранее 1980 года для нее не существуют.


ads ( 2003-09-30 09:56 ) [9]

> Palladin
потому что пользователь в строке ввода может все что угодно написать.
и мне придется синтаксис проверять.
а FileExists — (как следует из названия) — должна проверять существует ли ФАЙЛ. Один. блин.


ads ( 2003-09-30 10:01 ) [10]

> Verg
Del — задокументированная функция обработчика пользовательского ввода, поддерживающая маски файлов.
FileExists — функция библиотеки — с красивым названием но глупой реализацией.
Вот помню в Delphi 1 — была реализованна через FileAge()
.


Palladin ( 2003-09-30 10:01 ) [11]


> ads (30.09.03 09:56) [9]

ты знаешь. есть такая функция pos.
думаю ты не умрешь если напишешь подобное
if (pos(«*»,edit1.text)<>0) or (pos(«?»,edit1.text)<>0) then ShowMessage(«Недопустимые символы в имени файла»);


Verg ( 2003-09-30 10:05 ) [12]


> Вот помню в Delphi 1 — была реализованна через FileAge()


> потому что пользователь в строке ввода может все что угодно
> написать.
> и мне придется синтаксис проверять.

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

Читать еще:  Delphi datetime to string


ads ( 2003-09-30 10:05 ) [13]

Правда сама FileAge оставляет желать лучшего .


ads ( 2003-09-30 10:22 ) [14]

> Palladin
Pos — это конечно прекрасно. Тем и радует программирование что всегда можно найти обходной путь.
Можно было бы и функцию FileExists самому написать.
Может я просто много жду от RTL ? Самодокументрованые названия функций, комментарии в документации по Delphi .
> Verg
не надо путать ввод имени файла в поле ввода и
написание script-a пользователем.


panov ( 2003-09-30 10:24 ) [15]

Всегда пользовался таким методом и не было проблем:

1. TIniFile.Create;
2. Myparm := ReadString(. «»);
3. if MyParm=»» then
begin
MyParm=MyString;
WriteString(. MyParm);
end;

Если фала нет, он создается.
Если параметр не задан, то он записывается в файл со значением по умолчанию.


Anatoly Podgoretsky ( 2003-09-30 10:34 ) [16]

У тебя написано правильно, для ИНИ файлов проверять наличие нет нужды.


BlackKing ( 2003-09-30 11:59 ) [17]

Pri otkritii programmi popitajsja schitat» nuzhnije znachenija, jesli fajl ne sozdan, podstavjaca znachenija po umolchaniju. A potom ili pri vihode iz programmi ili srazu posle chtenija ili jesho kogda, sohrani eti vse znachenija, fajl sam sozdasca, jesli jesho ne sozdan.


han_malign ( 2003-09-30 12:45 ) [18]

>panov © (30.09.03 10:24) [15]
>Если фала нет, он создается.
— если не забывать про TIniFile.UpdateFile.


panov ( 2003-09-30 13:36 ) [19]

>han_malign © (30.09.03 12:45) [18]
Достаточно TIniFile.Free;


Rem ( 2003-09-30 14:01 ) [20]

function FileExistsEx(a_sFileName: string): boolean;
var
f: file;
begin
AssignFile(f, a_sFileName);
FileMode := fmOpenRead;
<$I->
Reset(f);
CloseFile(f);
<$I+>
Result := (IOResult = 0) and (a_sFileName <> «»);
end;


Black King ( 2003-09-30 22:37 ) [21]

Jest» jesho
function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;
iz SysUtils :o)

Создание, удаление и проверка на наличие папки в Delphi

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

Создание папки

Создать папку в Delphi можно воспользовавшись функцией CreateDir или процедурой MkDir. Так же можно воспользоваться функцией ForceDirectories. Первые две команды корректно выполняют создание одной новой папки. Отличия же в том, как они себя ведут в случае если создать папку невозможно.

Функция CreateDir, в результате своего выполнения возвращает True, если создание папки успешно выполнено и False, если по какой-то причине создание выполнить не удалось. Это удобно для случаев, когда заданная директория может быть уже создана. Здесь можно работать без предварительной проверки на существование такой директории.

Читать еще:  Как отключить защитник аваст

if CreateDir( ‘newfolder’ ) then
ShowMessage( ‘Папка успешно создана.’ )
else
ShowMessage( ‘Ошибка: папка не создана.’ );

Процедуру MkDir стоит использовать либо в случае, если заведомо известно, что создаваемой директории нет, либо с предварительной проверкой, так как при невозможности создать указанную папку, программа выведет ошибку.

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

// полный путь
my_dir1 = ‘С:/folder1/folder2/newfolder’ ;

// относительный путь
my_dir2 = ‘newfolder’ ;
my_dir3 = ‘folder1/newfolder’ ;
my_dir4 = ‘ ../newfolder’ ;

При использовании любой из указанных переменных, параметром для любой команды создания папки, будет создаваться только папка «newfolder». Создать директорию, используя переменные my_dir1 и my_dir3 можно только, если все остальные папки в директории уже существуют. Например, если папка «‘folder1» еще не создана, то и создать «newfolder» так не получится.

Создание нескольких вложенных подпапок

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

Такая команда создаст на диске C: все указанные папки.

Чтобы все же работать с фалами относительно папки с программой, можно указать вычисление пути к папке программы с помощью функции ExtractFilePath.

Удаление папки

При удалении папки, важно учитывать есть ли в ней вложения или нет. Если папка пуста, то используется функция RemoveDir, в которой аналогично созданию, указывается путь к удаляемой папке. Функция при своем выполнении так же возвращает True, если удаление успешно и False, если удалить не удалось.

if RemoveDir( ‘myfolder’ ) then
ShowMessage( ‘Папка успешно удалена.’ )
else
ShowMessage( ‘Ошибка: папка не удалена.’ );

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

TDirectory.Delete( ‘myfolder’ , True);

При этом, в разделе описаний должна быть добавлена библиотека IOUtils.

Если же такой возможности нет, стоит использовать следующую функцию, описанную еще в DelphiWorld. В параметре указывается путь к удаляемой папке. При успешном удалении (включая все вложения), функция вернет значение True, если удаление не удалось, вернет False.

// Функция удаления директории с вложениями.
function MyDirectoryDelete(dir: string): Boolean;
var
fos: TSHFileOpStruct;
begin
ZeroMemory(@fos, SizeOf(fos));
with fos do begin
wFunc := FO_DELETE;
fFlags := FOF_SILENT or FOF_NOCONFIRMATION
pFrom := PChar(dir + #0);
end ;
Result := (0 = ShFileOperation(fos));
end ;

// Вызов функции удаление в программе.
begin if MyDirectoryDelete( ‘myfolder’ ) then
ShowMessage( ‘Папка успешно удалена.’ )
else
ShowMessage( ‘Ошибка: папка не удалена.’ );
end ;

В раздел описаний здесь необходимо добавить библиотеку ShellApi.

Проверка существования директории

Для проверки наличия директории используется функция DirectoryExists. В параметре так же указывается полный или относительный путь к папке. Если заданная папка существует, функция вернет True, в обратном случае False.

if DirectoryExists( ‘myfolder’ ) then
ShowMessage( ‘Папка существует.’ )
else
ShowMessage( ‘Такой папки нет.’ );

Как проверить наличие Internet [Delphi]

Иногда, необходимо провести проверку подключен ли компьютер пользователя к сети интернет.

Читать еще:  Как уменьшить пинг в css

Для решения данной задачи можно воспользоваться несколькими способами.

1. функция InetIsOffline, как пишет MSDN, функция «Determines whether the system is connected to the Internet.» (Определяет, является ли система подключенной к Интернету).

Для использования функции, её необходимо импортировать из «url.dll»:

в нужном месте программы можно устроить следующую проверку:

В качестве возвращаемого значения используется BOOL:

Returns TRUE if the local system is not currently connected to the Internet. Returns FALSE if the local system is connected to the Internet or if no attempt has yet been made to connect to the Internet. (Возвращает TRUE, если локальная система в настоящее время не подключена к Интернету. Возвращает FALSE, если локальная система подключена к Интернету или если не было ни какой попытки подключения к Интернету.)

Таким образом, из описания (а также, из практики использования) функция не позволяет достоверно определить есть ли подключение к Интернету.

2. функция InternetGetConnectedState , как пишет MSDN, функция «Retrieves the connected state of the local system.» (Извлекает статус подключения локальной системы)

Для использования функции, её необходимо импортировать из «wininet.dll»:

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

В качестве возвращаемого значения используется BOOL:

Returns TRUE if there is an active modem or a LAN Internet connection, or FALSE if there is no Internet connection, or if all possible Internet connections are not currently active. (Возвращает TRUE, если есть активный модем или подключение к Интернету по сети, или FALSE если нет подключения к Интернету, или если все возможные интернет-соединения в настоящее время не активны.)

Следует обратить внимание на следующее:

A return value of TRUE from InternetGetConnectedState indicates that at least one connection to the Internet is available. It does not guarantee that a connection to a specific host can be established. (Когда возвращенное от InternetGetConnectedState значение TRUE, это означает, что по крайней мере одно соединение с Интернетом доступно. Но это не гарантирует, что связь с определенным хостом может быть установлена.)

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

3. метод использования Ping‘а или ICMP Echo-Request (ICMPInternet Control Message Protocol). Для этого можно использовать функцию IcmpSendEcho. Ссылка на MSDN.

Данный метод позволяет точно определить доступность конкретного интернет-ресурса, или в общем случае доступность, например, DNS серверов Google (8.8.8.8) или Яндекс (77.88.8.8).

Чтобы не повторяться, ниже я приведу исходный текст модуля, включающий в себя все три метода проверки наличия интернет. Также, доступна ссылка на файл с исходным кодом.

Следует также понимать, что в ряде случаев ICMP запросы могут быть запрещены сетевым экраном, параметрами настройки сети провайдера или правилами прокси-сервера. Кроме того, сам интернет ресурс может быть настроен таким образом, чтобы не отвечать на такие запросы.

Ссылка на основную публикацию
Adblock
detector