Delphi имя файла без расширения
Репутация: нет
Всего: нет
из OpenDialog->FileName можно получить имя файла с расширением, а можно ли получить имя файла без расширения?
и еще один момент, мы получаем имя файла в формате AnsiString, можно ли его как то сделать типа string ?
Репутация: 1
Всего: 1
ну блин. обрежь 4 последних символа.
ну . ищи с конца точку,потом обрезай.
из стандартного ничего не припомню. хотя может даже что-то и есть типа ExtractFileNameWithoutExt(AnsiString *str)
"Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал." (с) Хорги
Репутация: 5
Всего: 9
О майн готт.
Читаем справку по:
ExtractFileName
Цитата(AntonChik @ 22.2.2006, 13:16 ) |
ну блин. обрежь 4 последних символа. |
Репутация: 1
Всего: 1
Цитата(AntonChik @ 22.2.2006, 13:16 ) |
ну . ищи с конца точку,потом обрезай. |
"Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал." (с) Хорги
Репутация: 1
Всего: 1
Код |
AnsiString ExtractFileNameWithoutExt(AnsiString fullpath) return fullpath.SubString(ExtractFileDir(fullpath).Length()+2, fullpath.Length()-ExtractFileDir(fullpath).Length()- ExtractFileExt(fullpath).Length()-1); > |
"Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал." (с) Хорги
Репутация: 5
Всего: 9
Цитата(kosta @ 22.2.2006, 12:49 ) |
и еще один момент, мы получаем имя файла в формате AnsiString, можно ли его как то сделать типа string |
Репутация: 4
Всего: 15
Цитата(AntonChik @ 26.2.2006, 10:07 ) |
короче, вот чистое имя без расширения и пути. |
Код |
. return ExtractFileName(ChangeFileExt(fullpath, EmptyStr)); . |
Репутация: 1
Всего: 1
"Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал." (с) Хорги
Репутация: 5
Всего: 9
Цитата(Adil' @ 26.2.2006, 17:25 ) |
Код |
.
return ExtractFileName(ChangeFileExt(fullpath, EmptyStr));
.
Вот мой вариант:
Код |
String File_Name = LeftStr(ExtractFileName(FullPath), ExtractFileName(FullPath).Length()-ExtractFileExt(ExtractFileName(FullPath)).Length()); |
Запрещается!
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
- Литературу по С++ Builder обсуждаем здесь
- Действия модераторов можно обсудить здесь
- С просьбами о написании курсовой, реферата и т.п. обращаться сюда
- Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи
- FAQ раздела лежит здесь!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
[ Время генерации скрипта: 0.1212 ] [ Использовано запросов: 21 ] [ GZIP включён ]
← →silvestr ( 2006-07-05 09:56 ) [0]
Есть имя файла 111_3434_324сч_2.doc как вытащить именно имя файла без расширения ?
Или как срезать с конца 4 символа ?
← →MBo © ( 2006-07-05 09:59 ) [1]
В справке посмотри
file name utilities
icWasya © ( 2006-07-05 10:14 ) [2]
FileName_WishOut_Ext:=ChangeFileExt(FileName_Wist_Ext,"");
← →evvcom © ( 2006-07-05 10:19 ) [3]
> [2] icWasya © (05.07.06 10:14)
А файл переименовывать никто и не просил.
[0]: ExtractFileName, ExtractFileExt, Length, Copy.
Плохиш © ( 2006-07-05 10:58 ) [4]
> evvcom © (05.07.06 10:19) [3]
> > [2] icWasya © (05.07.06 10:14)
>
> А файл переименовывать никто и не просил.
А никто и не переименовывал.
function ExtractFileName(const FileName: string): string;
var
I: Integer;
begin
I := Length(FileName);
while (I >= 1) and not (FileName[I] in ["\", ":"]) do Dec(I);
Result := Copy(FileName, I + 1, Length(FileName)-I);
end; //End of function ExtractFileName
function ExtractFileExt(const FileName: string): string;
var
I: Integer;
begin
I := Length(FileName);
while (I > 1) and not (FileName[I] in [".", "\", ":"]) do Dec(I);
if (I > 0) and (FileName[I] = ".") then
Result := Copy(FileName, I, Length(FileName) - I + 1) else
Result := "";
end; //End of function ExtractFileExt
function ExtractFileNameWoExt(const FileName : string) : string;
begin
Result := ExtractFileName(FileName);
Result := Copy( Result, 1, Length( Result ) - Length( ExtractFileExt( Result ) ) );
end;
Бывают такие имена файлов
страничка.html
торрент.torrent
malyar ( 2007-10-23 18:09 ) [0]
привет всем
народ подскажите как получить из имени файла с расширением
имя файла без расширения
s:="proga.exe" s:="pr.o.g.a.exe"
как правилино отсеч расширение у выше приведенных файлов?
существует ли функция (поиск вхождения строки в строку) где поиск начинается не сначала а с конца строки ?
← →Palladin © ( 2007-10-23 18:11 ) [1]
ага
Function CharPosBack(c:Char;Const s:String):Integer;
Var
i:Integer;
Begin
For i:=Length(s) Downto 1 Do
If s[i]=c Then
Begin
Result:=i;
Exit;
End;
Result:=0;
End;
antonn © ( 2007-10-23 18:14 ) [2]
function DeleteExtension( Filename : String) : string;
var Ext : String; extl, p : Integer;
begin
Ext := ExtractFileExt(filename);
extl := Length(Ext);
P := Pos(Ext, Filename);
if P <> 0 then begin
Delete(Filename, Length(Filename) - extl + 1 ,extl);
Result := Filename;
end;
end;
Reindeer Moss Eater © ( 2007-10-23 18:16 ) [3]
крута
← →Amoeba © ( 2007-10-23 18:19 ) [5]
> antonn © (23.10.07 18:14) [2]
а если имя файла, к примеру будет типа хyz.exe.exe (вполене допустимое, между прочим)? Что получим на выходе?
Palladin © ( 2007-10-23 18:19 ) [6]
у как жестоко :)
Function FileNameWOExt(Const s:String):String;
Var
n:Integer;
Begin
n:=CharPosBack(".",s);
If n=0 Then Result:=s Else Result:=Copy(s,1,n-1);
End;
Amoeba © ( 2007-10-23 18:20 ) [7]
> Reindeer Moss Eater © (23.10.07 18:16) [3]
Опередил!
antonn © ( 2007-10-23 18:24 ) [8]
> а если имя файла, к примеру будет типа хyz.exe.exe (вполене
> допустимое, между прочим)? Что получим на выходе?
получим хyz.exe
Amoeba © ( 2007-10-23 18:25 ) [9]
> antonn © (23.10.07 18:24) [8]
>
>
> > а если имя файла, к примеру будет типа хyz.exe.exe (вполене
> > допустимое, между прочим)? Что получим на выходе?
>
> получим хyz.exe
>
Естественно.
Palladin © ( 2007-10-23 18:26 ) [10]
> antonn © (23.10.07 18:24) [8]
пример тебе не верный привели, таким быть должен он (с) Йода :)
file.txt.ext.ext.txt
← →Reindeer Moss Eater © ( 2007-10-23 18:27 ) [11]
а если proga.exeblablabla.exe
← →antonn © ( 2007-10-23 18:29 ) [12]
давайте сразу скажите, что там не так?
file.txt.ext.ext.txt - file.txt.ext.ext
proga.exeblablabla.exe - proga.exeblablabla
megabyte © ( 2007-10-23 18:38 ) [13]
Отсекаем с конца 4 символа и всего делов-то.
← →Reindeer Moss Eater © ( 2007-10-23 18:38 ) [14]
ок.
а вот это-то зачем?
P := Pos(Ext, Filename);
if P <> 0 then
на случай если расширения нет совсем?
так логичнее просто проверять на пустую строку саму Ext.
malyar ( 2007-10-23 18:39 ) [15]
thx
← →antonn © ( 2007-10-23 18:43 ) [16]
> Отсекаем с конца 4 символа и всего делов-то.
.mpeg/.jpg/.divx и тд :)
antonn © ( 2007-10-23 18:43 ) [17]
> Reindeer Moss Eater © (23.10.07 18:38) [14]
для наглядности %)
Anatoly Podgoretsky © ( 2007-10-23 19:23 ) [18]
> malyar (23.10.2007 18:09:00) [0]
ChangeFileExt
← →Riply © ( 2007-10-23 22:52 ) [19]
> [6] Palladin © (23.10.07 18:19)
Такой некузяво обработает
C:\My.Super.Puper.Dir\Test.exe
:)
DVM © ( 2007-10-23 22:55 ) [20]
function ExtractFileNameWoExt(const FileName : string) : string;
begin
Result := ExtractFileName(FileName);
Result := Copy( Result, 1, Length(Result) - Length(ExtractFileExt(Result)));
end;
Riply © ( 2007-10-24 00:03 ) [21]
> [20] DVM © (23.10.07 22:55)
Споткнемся на: C:\MyDir\MyFile.txt:mydata
Правда, строго говоря, это не совсем файл, но имеет право на существование :)
DVM © ( 2007-10-24 00:08 ) [22]
> Riply © (24.10.07 00:03) [21]
так не честно
Германн © ( 2007-10-24 01:22 ) [23]
> DVM © (24.10.07 00:08) [22]
>
>
> > Riply © (24.10.07 00:03) [21]
>
> так не честно
>
Не честно предлагать попробовать на своём компьютере имя файла Con. А [21] - это просто шутка, но увы. Лёгка была жизнь только при 8.3 :)
megabyte © ( 2007-10-24 10:47 ) [24]
> antonn © (23.10.07 18:43) [16]
>
> > Отсекаем с конца 4 символа и всего делов-то.
>
> .mpeg/.jpg/.divx и тд :)
фишка в том, что, исходя из задачи, можно понять, какой длины будет расширение :Р *типа отмазался*
Reindeer Moss Eater © ( 2007-10-24 11:21 ) [25]
FileNameWoExt := Copy(FileName,1,Abs(StrRScan(PChar(FileName),".") - PChar(FileName)));
← →Riply © ( 2007-10-24 11:48 ) [26]
>[25] Reindeer Moss Eater © (24.10.07 11:21)
> Copy(FileName,1,Abs(StrRScan(PChar(FileName),".") - PChar(FileName)));
Напартачим с таким файлом:
C:\MySuper.Puper.Directory\FileWithOutExt
:)
Reindeer Moss Eater © ( 2007-10-24 12:22 ) [27]
SetLength(FileNameWoExt,Length(FileName));
ZeroMemory(PChar(FileNameWoExt),Length(FileNameWoExt));
StrLCopy(PChar(FileNameWoExt),
PChar(Max(Integer(PChar(FileName)),succ(Integer(StrRScan(PChar(FileName),"\")))) ),
Abs(
StrRScan(PChar(FileName),".")
-
PChar(Max(Integer(PChar(FileName)),succ(Integer(StrRScan(PChar(FileName),"\")))) )
)
);
Ой торопишся.
На такой файл : FileName := "C:\MySuper.Puper.Dir\TestFile",
приведенный тобой код мне сообщает, что имя без расширения выглядит так: "TestF" :)
Reindeer Moss Eater © ( 2007-10-24 13:07 ) [29]
Хорошо, будем использовать предварительное ExtractFileName.
Хотя я еще не сдаюсь.
Riply © ( 2007-10-24 13:31 ) [30]
Я бы попробовала так:
в одном цикле с конца FileName, делала бы проверку типа:
case FileName[i] of
"\": нет расширения - выходим;
":": зависит от того интересуют нас "поточные файлы или нет".
для обычных: нет расширения - выходим;
".": фиксируем сколько символов в расширении, выходим;
else dec(i);
end;
Обратимся к опциям проекта в Delphi: меню Project -> Options. -> вкладка Version Info (см. Рис. 1). На этй вкладке указывается нужная нам информация. Чтобы получить доступ к ней, поставим крыжик на Include version information in project, что по-русски означает "Включить информацию о версии в проект".
Рис. 1
Теперь пройдемся по содержимому вкладки:
Mdule version namber - здесь можно задать номер версии файла. Крыжик на Auto-increment build number позволит автоматически увеличивать номер версии при каждой сборке проекта.
Примечание: Номер версии будет автоматически увеличиваться только в том случае, если произведена сборка проекта (меню Project -> Build Project). Просто при компиляции номер версии не изменяетя.
Mdule attributes - эти флаги можно включить в информацию о версии только с чисто информационной целью. Рассмотрим их значения:
Аттрибут | Эффект |
---|---|
Debug build | Включается чтобы показать что проект был скомпилирован в режиме отладки. |
Pre-release | Включается чтобы показать что версия не для коммерческого использования. |
DLL | Включается чтобы показать что проект использует динамически подключемые библиотеки (DLL). |
Special build | Включается чтобы показать что данная версия - вариант стандартного релиза. |
Private build | Включается чтобы показать что данная версия собиралась без использования стандартных процедур релиза. |
Language - показывает какая кодовая страница потребуется системе для выполнения данной программы. Выбери планируемый язык программы из выпадающего спика. Шестнадцатиричное значение выбранной локализации появится над выпадающим списком.
Ну, и, наконец, окно со списком ключей. Количество ключей, их состав и значения строго не регламентируются. Ключи можно удалять, добавлять новые, изменять их наименование. По умолчанию предлагается список из десяти ключей, зачения которых понимаются и однозначно интерпретирутся Windows.
Как видно из представленной таблицы ключи по умолчанию содержат всю интересующую нас информацию о программе (ну, а если этого недостаточно, то добавьте свои собственные ключи). Заполните их значения и откомпилируйте программу. Теперь в Windows можно щелкнуть правой клавишей мыши на файле программы и в свойствах файла появится вкладка с информацией о версии программы как показано ниже (см. Рис. 2):
Рис. 2
Примечание: Практически вся эта информация прицепляется при компиляции в текстовом виде в качестве довеска в конец файла после кода программы. Она входит в контрольную сумму файла и поэтому считается что подделать ее нельзя. Начинается она с текста StringFileInfo. Дальше идет указатель на рабочую кодовую страницу программы в шестнадцатиричном коде. Потом идут: имя первого ключа и его значение, имя второго ключа и его значение и т.д. по всему списку ключей. Подробную ее структуру можно посмотреть в хелпе по Delphi6. В Delphi7 я информации по структуре уже не нашел :(.
Теперь у нас имеется вся нужная информация. Осталось дело за малым. Считать ее и вывести в удобном для нас виде. Подробнее см. Читать информацию о версии файла.
Приступим к программированию пунктов меню Открыть, Сохранить, Сохранить как…, Выход.
Нам понадобится общая переменная fFilePath типа String для всех процедур, которая будет хранить полный путь к открытому файлу. Опишем ее в разделе var перед ключевым словом implementation следующим образом :
Такой способ описания позволяет сразу «обнулить» нашу переменную.
Теперь опишем процедуру открытия файла с помощью диалога выбора файла. Для этого на форме в режиме разработки, щелкните по Файл-Открыть
После чего откроется редактор кода с созданной процедурой TForm1.fOpenClick
В нее необходимо поместить следующий код:
if fOpenDialog.Execute then
begin
fFilePath:=fOpenDialog.FileName;
txt.Lines.LoadFromFile(fFilePath);
end;
Функция Execute диалога fOpenDialog открывает окно выбора файла. При выборе файла и нажатия кнопки Открыть, функция возвращает True, если нажата кнопка Отмена, то false. Обратите внимание, диалог вызывается с использование условия if, т.е. мы проверяем результат выполнения Execute.Если результат Истина, то мы продолжаем открытие файла, если Иначе, то ничего не происходит. Если не сделать такую проверку, диалог сработает при выборе файла, но если пользователь откажется открывать файл и нажмет Отмена, выскочит ошибка т.к. txt.Lines.LoadFromFile попытается открыть файл, который не выбран.
В данной процедуре мы присваиваем переменной fFilePath, полный путь к выбранному файлу вида «x:\mytxt\txtFile.txt», который возвращает функция FileName диалога fOpenDialog и загружаем текст в txt.
Вот и все открытие файла.
Далее пункт «Сохранить как…».
Так же кликаем по данному пункту и в созданной процедуре TForm1.fSaveAsClick пишем код:
if fFilePath='' then fsavedialog.FileName:='Новый документ.txt'
else fsavedialog.FileName:=fFilePath;
if fSaveDialog.Execute then
begin
if extractfileext(fSaveDialog.FileName)='' then
fFilePath:=fSaveDialog.FileName+'.txt'
else fFilePath:=fSaveDialog.FileName;
txt.Lines.SaveToFile(fFilePath);
end;
Эта процедура посложнее. Объясню ее работу:
Первое условие IF – это по сути украшение, проверяет переменную fFilePath и если она пуста, то в поле указания имени файла выведет имя по умолчанию «Новый документ.txt». Переменная fFilePath пуста только в том случае, если мы будем создавать документ, а не открывать его для редактирования. Если же переменная fFilePath не пуста, то будет выведено имя файла, который был открыт.
Второе условие IF – выполняет запуск диалога сохранения.
Третье условие IF – проверяет, имеет ли введенное имя файла расширение, если введено просто имя файла без его расширения, то к имени добавляется «.txt». Функция extractfileext извлекает из полного имени файла его расширение. Например, файл «Мой блокнот.txt», функция вернет его расширение «txt». Если не сделать данную проверку и присоединение расширения, то будет создан файл без указанного расширения, и в системе он будет не опознанным. Если же оставить только присоединение расширения и при этом имя файла будет «Мой блокнот.txt», то к имени будет добавлено еще расширение «txt», в результате получим файл «Мой блокнот.txt.txt».
Теперь пункт «Сохранить». Обратите внимание, во всех редакторах, если создать новый документ и нажать на «Сохранить», то будет открыт диалог «Сохранить как», если же документ открыт для редактирования, то происходит просто сохранение изменений. Реализуем тоже самое в нашем блокноте.
Создаем процедуру TForm1.fSaveClick вышеуказанным способом и пишем следующий код:
if fFilePath='' then fSaveAs.Click
else txt.Lines.SaveToFile(fFilePath);
т.е. мы проверяем переменную fFilePath, если она пуста, то вызываем процедуру пункта меню «Сохранить как…» - fSaveAs. По сути, мы программно «нажимаем» на пункт меню «Сохранить как…». Если же файл был открыт, то просто сохраняем изменения в файл.
И последний пункт меню «Выход».
Команда данного пункта проста и однострочна:
Вот так выглядит полный листинг нашей программы (по основным пунктам я расставил комментарии). Исходники и скомпилированный проект в прикрепленном архиве.
unit exNotepad;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus;
type
TForm1 = class(TForm)
txt: TMemo;
MainMenu1: TMainMenu;
N1: TMenuItem;
fOpen: TMenuItem;
fSave: TMenuItem;
fSaveAs: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
fOpenDialog: TOpenDialog;
fSaveDialog: TSaveDialog;
procedure fOpenClick(Sender: TObject);
procedure fSaveAsClick(Sender: TObject);
procedure fSaveClick(Sender: TObject);
procedure N3Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
fFilePath: string = '';
implementation
procedure TForm1.fOpenClick(Sender: TObject);
begin
//запуск диалога открытия файла
if fOpenDialog.Execute then
begin
fFilePath:=fOpenDialog.FileName;
txt.Lines.LoadFromFile(fFilePath);
end;
end;
procedure TForm1.fSaveAsClick(Sender: TObject);
begin
//если fFilePath пусто, то выводим имя по умолчанию
if fFilePath='' then fsavedialog.FileName:='Новый документ.txt'
// если fFilePath не пусто
else fsavedialog.FileName:=fFilePath;
//запуск диалога сохранения
if fSaveDialog.Execute then
begin
//проверяем есть ли расширенеие у заданного файла
//если нет, то задаем .txt
if extractfileext(fSaveDialog.FileName)='' then
fFilePath:=fSaveDialog.FileName+'.txt'
//если есть, то оставляем
else fFilePath:=fSaveDialog.FileName;
//сохраняем файл
txt.Lines.SaveToFile(fFilePath);
end;
end;
procedure TForm1.fSaveClick(Sender: TObject);
begin
//если fFilePath пуста то открывает диалог сохранения
if fFilePath='' then fSaveAs.Click
//иначе просто сохраняем открытый файл
else txt.Lines.SaveToFile(fFilePath);
end;
procedure TForm1.N3Click(Sender: TObject);
begin
form1.Close;
end;
end.
П.С. Для того чтоб при открытии текста, появились полосы прокрутки у объекта Memo (txt) необходимо указать свойство ScrollBars = ssBoth.
Прикрепленный файл: exNotepad v1.1.zip
Читайте также: