2024/06/03 電子書籍「電子書籍出版・技術文書作成を劇的に加速!秀丸エディタ + Markdown + Pandocの驚異」を出版

ファイル名及びフォルダ操作ルーチン

C++Builder

C++Builderで、ファイル名及びフォルダ操作ルーチンに関する情報(ヘルプ)がありましたので、以下にまとめました。また、使い方のサンプルコードを追加しました。

代表的な関数の使い方

拡張子の変更

拡張子を変更します。Application->ExeNameは、アプリケーションの実行ファイル名です。

ChangeFileExt関数を使用

Extension は,新しい拡張子(最初のドット文字を含む)を指定します。

// インクルードファイル
#include <System.SysUtils.hpp>

// 使用例
String inifname			= ChangeFileExt(Application->ExeName, ".ini");

TPath::ChangeExtension関数の使用

TPath::ChangeExtension関数の使用

その拡張子を、Extension パラメータで渡された拡張子に変更します。指定された新しい拡張子には、先頭のピリオドを含めてもかまいません。

// インクルードファイル
#include <System.IOUtils.hpp>

// 使用例
String inifname			= TPath::ChangeExtension(Application->ExeName, ".ini");

ファイル名のパスの変更します。

	String fname = ChangeFilePath(Application->ExeName, GetHomePath());

実行ファイルと同じフォルダ内のファイル名を生成

IncludeTrailingPathDelimiter は、パス名の末尾に必ず区切り記号を追加する関数です。フォルダパスとファイル名を組み合わせてパスを作成する際にこの関数を使用すると便利です。

ExtractFileDir関数使用時

	String fname 	= ExtractFileDir(Application->ExeName);
	fname			= IncludeTrailingPathDelimiter(fname) + "TestFile.txt";

TPath::GetDirectoryName使用時

	String fname 	= TPath::GetDirectoryName(Application->ExeName);
	fname			= IncludeTrailingPathDelimiter(fname) + "TestFile.txt";

ファイルの各要素の取得

System.SysUtils を使用した場合

    String wstr;
	
    // ファイル名のドライブ部分を返します。
	wstr	= ExtractFileDrive(Application->ExeName);
	Memo1->Lines->Add(wstr);

	// ファイル名の拡張子部分を返します。(実行ファイルであれは、".exe")
	wstr	= ExtractFileExt(Application->ExeName);
	Memo1->Lines->Add(wstr);

	// ファイル名の名前部分と拡張子部分を抽出します。
	wstr	= ExtractFileName(Application->ExeName);
	Memo1->Lines->Add(wstr);

	// ファイル名のドライブ部分とディレクトリ部分を返します。(パス名の末尾に、区切り記号が付きます。)
	wstr	= ExtractFilePath(Application->ExeName);
	Memo1->Lines->Add(wstr);

TPathクラスの関数を使用した場合

    String wstr;

	// ファイル名のドライブ部分とディレクトリ部分を抽出します。
	wstr	= TPath::GetDirectoryName(Application->ExeName);
	Memo1->Lines->Add(wstr);

	// ファイル名の拡張子部分を抽出します。
	wstr	= TPath::GetExtension(Application->ExeName);
	Memo1->Lines->Add(wstr);

	// ファイル名の名前部分と拡張子部分を抽出します。
	wstr	= TPath::GetFileName(Application->ExeName);
	Memo1->Lines->Add(wstr);

	// ファイル名の名前部分(拡張子を除く)を抽出します。
	wstr	= TPath::GetFileNameWithoutExtension(Application->ExeName);
	Memo1->Lines->Add(wstr);

指定したファイルが存在するかどうかを判定

FileExistsを使用

	if(FileExists(Application->ExeName))
	{
		Memo1->Lines->Add("ファイルあり");
	} else {
		Memo1->Lines->Add("ファイルなし");
	}

TFile::Existsを使用

	if(TFile::Exists(Application->ExeName))
	{
		Memo1->Lines->Add("ファイルあり");
	} else {
		Memo1->Lines->Add("ファイルなし");
	}

指定したディレクトリが存在するかどうかを判定

DirectoryExists関数を使用します。パス名の末尾の区切り記号の有無に関係なく使用できます。

DirectoryExists

    String path	= ExtractFilePath(Application->ExeName);
	if(DirectoryExists(path))
	{
		Memo1->Lines->Add("フォルダあり");
	} else {
		Memo1->Lines->Add("フォルダなし");
	}

TDirectory::Exists

    String path	= TPath::GetDirectoryName(Application->ExeName);    
	if(TDirectory::Exists(path))
	{
		Memo1->Lines->Add("フォルダあり");
	} else {
		Memo1->Lines->Add("フォルダなし");
	}

ユーザーのホーム パスの取得

	// ユーザーのホーム パスを返します。
	String HomePath	= GetHomePath();

取得できる各プラッチフォームのホームパスです。

プラットフォームホームパス
Windows XPC:\Documents and Settings\\Application Data
Windows Vista 以降C:\Users\\AppData\Roaming
OS X/Users/
iOS デバイス/private/var/mobile/Containers/Data/Application/
iOS シミュレータ/Users//Library/Developer/CoreSimulator/Devices//data/Containers/Data/Application/
Android/data/data//files
Linux/home/
GetHomePathで取得する各プラットフォームでのユーザーのホームパス

ファイルまたはディレクトリ属性の取得

TPath::GetAttributesを使用して、ファイルまたはディレクトリ属性を取得することが出来ます。

	// ファイルまたはディレクトリ属性を返します。
	TFileAttributes attributes = TPath::GetAttributes(Application->ExeName);

    // 属性をチェック
    if (attributes.Contains(TFileAttribute::faReadOnly)) 
    {
		Memo1->Lines->Add(L"読み取り専用ファイルです。");
    }
    if (attributes.Contains(TFileAttribute::faHidden)) 
    {
		Memo1->Lines->Add(L"隠しファイルです。");
    }
	if (attributes.Contains(TFileAttribute::faSystem))
    {
		Memo1->Lines->Add(L"システムファイルです。");
    }
    if (attributes.Contains(TFileAttribute::faDirectory)) 
    {
		Memo1->Lines->Add(L"ディレクトリです。");
    }
    if (attributes.Contains(TFileAttribute::faArchive)) 
    {
		Memo1->Lines->Add(L"アーカイブファイルです。");
    }
    if (attributes.Contains(TFileAttribute::faNormal)) 
    {
		Memo1->Lines->Add(L"通常ファイルです。");
    }
Windows の場合、TFileAttribute の取り得る値
意味
faReadOnly読み取り専用ファイルまたは読み取り専用ディレクトリであることを示します。
faHidden隠しファイルまたは隠しディレクトリであることを示します。
faSystemシステム ファイルまたはシステム ディレクトリであることを示します。
faDirectoryディレクトリであることを示します。
faArchiveWindows アーカイブ ファイルであることを示します。
faDeviceWindows デバイス ファイルであることを示します。
faNormal通常のファイルであることを示します。
faTemporary一時ファイルまたは一時ディレクトリであることを示します。
faSparseFileスパース ファイルであることを示します。スパース ファイルとは、ほとんどゼロで埋められた大きいファイルのことです。
faReparsePoint再解析ポイントであることを示します。再解析ポイントとは、実際のファイルまたはディレクトリにリンクしているユーザー定義データ ブロックのことです。
faCompressed圧縮ファイルまたは圧縮ディレクトリであることを示します。
faOffline内容が使用不能なオフライン ファイルであることを示します。
faNotContentIndexedインデックス付け操作を省略されたファイルであることを示します。
faEncrypted暗号化されたファイルまたはディレクトリであることを示します。
faSymLinkシンボリック リンクであることを示します。
System.IOUtils.TFileAttribute
POSIX の場合、TFileAttribute の取り得る値。
意味
faNamedPipe名前付きパイプ(FIFO)であることを示します。名前付きパイプは、あるプロセスから別のプロセスに情報を転送するためなどに使用することができます。
faCharacterDeviceキャラクタ デバイス(順に読み取らなければならないデータ フローを提供するファイル記述子)であることを示します。キャラクタ デバイスの例には、キーが押されると次の文字が読み取られる端末などがあります。
faDirectoryディレクトリであることを示します。
faBlockDeviceブロック デバイスであることを示します。ブロック デバイスとキャラクタ デバイスの違いは、ブロック デバイスにはリクエスト用のバッファがあるため、どの順序で応答するかを選択できることです。
faNormal通常のファイルであることを示します。
faSymLinkシンボリック リンク(別のファイルやディレクトリの参照を絶対パスまたは相対パスの形式で含むファイル記述子)であることを示します。
faSocketソケットであることを示します。
faWhiteoutホワイトアウト ファイル(存在しないためそれに対して操作を実行することができないファイル)であることを示します。
faOwnerRead所有者はファイル記述子を読み取ることができます。
faOwnerWrite所有者はファイル記述子に書き込むことができます。
faOwnerExecute所有者はファイル記述子を実行することができます。
faGroupReadグループ内のすべてのユーザーがファイル記述子を読み取ることができます。
faGroupWriteグループ内のすべてのユーザーがファイル記述子に書き込むことができます。
faGroupExecuteグループ内のすべてのユーザーがファイル記述子を実行することができます。
faOthersRead所有者以外のユーザーがファイル記述子を読み取ることができます。
faOthersWrite所有者以外のユーザーがファイル記述子に書き込むことができます。
faOthersExecute所有者以外のユーザーがファイル記述子を実行することができます。
faUserIDExecution実行中のユーザー ID。実行できるよう昇格される場合があります。
faGroupIDExecution実行中のグループ ID。実行できるよう昇格される場合があります。
faStickyBit所有者以外のプロセスがファイルを削除できないようにします。

シンボリックリンクの作成

TFile::CreateSymLinkを使用して、シンボリック リンクを作成する事ができます。以下は、デスクトップにアプリケーションのシンボリックリンクを作成するサンプルコードです。

SHGetFolderPathW関数(API)で、デスクトップのフォルダ名を取得しています。

以下、注意事項です。

  • ンボリックリンクを作成するには、管理者権限が必要です。プログラムを管理者として実行してください。
  • リンク対象ファイルまたはディレクトリは、CreateSymLink の呼び出し時には存在していなければなりません。
  • CreateSymLink は、Windows Vista 以降の Windows 版でのみ使用できます。
#include <stdio.h>
#include <System.SysUtils.hpp>

    // -----------------------------------------------------
	String TargetApp = Application->ExeName;

    // デスクトップのパスを取得
	wchar_t desktopPath[MAX_PATH];
    if (SHGetFolderPathW(NULL, CSIDL_DESKTOP, NULL, 0, desktopPath) != S_OK)
    {
        ShowMessage(L"デスクトップのパスを取得できませんでした。");
        return ;
    } else {
		 Memo1->Lines->Add(desktopPath);
	}

    // シンボリックリンクのパスを設定
    String linkPath = String(desktopPath) + L"\\MyApp.lnk";
	bool ret = TFile::CreateSymLink(linkPath, TargetApp);
	if(ret)
	{
		 Memo1->Lines->Add(L"シンボリックリンクの作成に成功しました!");
	} else {
        DWORD error = GetLastError();
		wstr	= (String)"シンボリックリンクの作成に失敗しました。エラーコード: " + IntToStr((int)error);
		Memo1->Lines->Add(wstr);
	}

関数の一覧

System.SysUtils

System.SysUtilsで、定義されているファイル名及びフォルダ操作関係の関数一覧です。

昔からある、関数です。

メンバ説明
System.SysUtils.AnsiCompareFileName現在のロケールに基づいてファイル名を比較します。
System.SysUtils.AnsiLowerCaseFileNameファイル名を小文字に変換します。
System.SysUtils.ChangeFileExtファイル名の拡張子を変更します。
System.SysUtils.ChangeFilePathファイル名のパスを変更します。
System.SysUtils.DirectoryExists指定したディレクトリが存在するかどうかを判定します。
System.SysUtils.ExcludeTrailingBackslash末尾に区切り記号が付いていないパス名を返します。(後方互換性のため)
System.SysUtils.ExcludeTrailingPathDelimiter末尾に区切り記号が付いていないパス名を返します。(こちを推奨)
System.SysUtils.ExpandFileName相対ファイル名の完全パス名を返します。
System.SysUtils.ExpandFileNameCase大文字と小文字を区別するファイル システム上の相対ファイル名の完全パス名を返します。
System.SysUtils.ExpandUNCFileName適切な場合、UNC 形式のファイル名の完全パスを返します。
System.SysUtils.ExtractFileDirファイル名からドライブ部分とディレクトリ部分を抜き出します。
System.SysUtils.ExtractFileDriveファイル名のドライブ部分を返します。
System.SysUtils.ExtractFileExtファイル名の拡張子部分を返します。
System.SysUtils.ExtractFileNameファイル名の名前部分と拡張子部分を抽出します。
System.SysUtils.ExtractFilePathファイル名のドライブ部分とディレクトリ部分を返します。
System.SysUtils.ExtractRelativePath特定のベース ディレクトリからの相対パス名を返します。
System.SysUtils.ExtractShortPathNameファイル名を短い 8.3 形式に変換します。
System.SysUtils.IncludeTrailingBackslashパス名の末尾が必ず区切り記号になるようにします。(後方互換性のため)
System.SysUtils.IncludeTrailingPathDelimiterパス名の末尾が必ず区切り記号になるようにします。(こちを推奨)
System.SysUtils.IsPathDelimiter文字列内の指定位置にあるバイト データがパス区切り記号かどうかを示します。
System.SysUtils.SameFileName現在のロケールに基づいてファイル名を比較します。

System.IOUtils.TPath

Delphi 2010以降に追加された関数(TPathクラス)です。

FMXとの互換性を考慮する場合は、こちらを使った方が良いかと思います。

FMXでは、FMX.Objects.TPath で定義されています。

メンバ説明
System.IOUtils.TPath.ChangeExtension指定されたパスで示されるファイルまたはディレクトリの拡張子を変更します。
System.IOUtils.TPath.Combine2 つのパス文字列を結合します。
System.IOUtils.TPath.DriveExists指定されたパスで使用されているドライブ文字が実際に存在するかどうかを確かめます。
System.IOUtils.TPath.GetAttributesファイルまたはディレクトリ属性を返します。
System.IOUtils.TPath.GetDirectoryNameファイル名のドライブ部分とディレクトリ部分を抽出します。
System.IOUtils.TPath.GetExtendedPrefix指定されたパスの拡張プレフィックス タイプを返します。
System.IOUtils.TPath.GetExtensionファイル名の拡張子部分を抽出します。
System.IOUtils.TPath.GetFileNameファイル名の名前部分と拡張子部分を抽出します。
System.IOUtils.TPath.GetFileNameWithoutExtensionファイル名の名前部分(拡張子を除く)を抽出します。
System.IOUtils.TPath.GetFullPath指定されたパスの絶対パスを返します。
System.IOUtils.TPath.GetGUIDFileName一意なファイル名として使用できる新しい GUID を生成します。
System.IOUtils.TPath.GetHomePathユーザーのホーム パスを返します。
System.IOUtils.TPath.GetRandomFileNameランダムなファイル名を新たに生成します。
System.IOUtils.TPath.GetTempFileName一意な一時ファイルを生成します。
System.IOUtils.TPath.GetTempPathシステムの一時ディレクトリへのパスを返します。
System.IOUtils.TPath.HasExtension指定されたファイル名に拡張子部分があるかどうかを確かめます。
System.IOUtils.TPath.HasValidFileNameChars指定されたファイル名が使用可能な文字だけで構成されているかどうかを確かめます。
System.IOUtils.TPath.HasValidPathChars指定されたパス文字列が使用可能な文字だけで構成されているかどうかを確かめます。
System.IOUtils.TPath.IsDriveRooted指定されたパスがドライブ文字で始まる絶対パスかどうかを確かめます。
System.IOUtils.TPath.IsExtendedPrefixed指定されたパスに拡張プレフィックスが含まれているかどうかを確かめます。
System.IOUtils.TPath.IsPathRooted指定されたパスが相対パスか絶対パスかを確かめます。
System.IOUtils.TPath.IsUNCPath指定されたパスが UNC(Universal Naming Convention:汎用命名規則)形式かどうかを確かめます。
System.IOUtils.TPath.IsUNCRooted指定されたパスが UNCルート形式かどうかを確かめます(UNC は、汎用命名規則(Universal Naming Convention)を表す)。
System.IOUtils.TPath.IsValidFileNameChar指定された文字がファイル名で使用可能かどうかを確かめます。
System.IOUtils.TPath.IsValidPathChar指定された文字がパス文字列で使用可能かどうかを確かめます。
System.IOUtils.TPath.SetAttributesファイルまたはディレクトリ属性を設定します。
System.IOUtils.TPath

System.IOUtils.TFile

System.IOUtils.TPathで、定義されている関数です。Delphi 2010以降に追加されました。

メンバ説明
System.IOUtils.TFile.CreateSymLinkシンボリック リンクを作成します。「System.SysUtils.TSymLinkRec」を参照。
System.IOUtils.TFile

その他

上記以外の関数です。

メンバ説明
Vcl.FileCtrl.MinimizeName指定された長さ制限の中に描画できるように、完全修飾パス名を短縮します。

参考URL

以下、参考となるURLです。

タイトルとURLをコピーしました