フリーソフト

ファイル、フォルダの処理

[C++Builder] ファイル名がワイルドカードにマッチしているかを調べる

#include <Masks.hpp>

MatchesMask

[BCB] 空ではないフォルダを削除する関数

RemoveDir関数は空でないフォルダを削除することができません。空ではないフォルダを削除するにはSHFileOperationを使う方法もありますが、ここでは再帰的に削除する方法を示します。

bool __fastcall TForm1::ForceRemoveDir(AnsiString DirName)
{
  TSearchRec sr;
  int Attr=faAnyFile;
  bool Result=true;

  DirName=IncludeTrailingPathDelimiter(DirName);
  if (FindFirst(DirName+"*",Attr,sr)==0) {
    do {
      if ((sr.Name==".")||(sr.Name=="..")) continue;

      if ((sr.Attr&faDirectory)!=0)
        Result=Result && ForceRemoveDir(DirName+sr.Name);
      else
        Result=Result && DeleteFile(DirName+sr.Name);
    } while (FindNext(sr)==0);
    FindClose(sr);
  }
  Result=Result && RemoveDir(ExcludeTrailingPathDelimiter(DirName));
  return Result;
}

[BCB] システムフォルダを取得する

デスクトップやマイドキュメントなどの特殊フォルダの位置を取得する方法です。
以下はデスクトップの位置を取得する例です。

#include <shlobj.h>


  TCHAR szPath[_MAX_PATH];
  LPITEMIDLIST pidl;

  IMalloc *pMalloc;
  SHGetMalloc(&pMalloc);

  if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY, &pidl))) {
    SHGetPathFromIDList(pidl,szPath);
    pMalloc->Free(pidl);             
  }
  pMalloc->Release();

[BCB] ファイルのタイムスタンプ(更新日時など)を取得

ファイルの「作成日時」「更新日時」「アクセス日時」を取得する方法です。手順は
1.ファイルをオープン (CreateFile)
2.ファイルタイムを取得 (GetFileTime)
3.取得したファイルタイム(UTC)をローカルタイムに変換 (FileTimeToLocalFileTime)
4.ローカルファイルタイムをシステムタイムに変換 (FileTimeToSystemTime)
5.システムタイムをTDateTime型に変換 (SystemTimeToDateTime)
6.ファイルをクローズ (CloseHandle)
となります。

  HANDLE hFile;
  FILETIME FtCreationTime,FtLastAccessTime,FtLastWriteTime;
  FILETIME LftCreationTime,LftLastAccessTime,LftLastWriteTime;
  SYSTEMTIME StCreationTime,StLastAccessTime,StLastWriteTime;

  hFile = CreateFile(Filename.c_str() , GENERIC_READ , 0 , NULL ,
  OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
  if (hFile != INVALID_HANDLE_VALUE) {
    GetFileTime(hFile,&FtCreationTime,&FtLastAccessTime,&FtLastWriteTime);

    FileTimeToLocalFileTime(&FtCreationTime,&LftCreationTime);
    FileTimeToSystemTime(&LftCreationTime ,&StCreationTime);
    Edit1->Text=FormatDateTime("yyyy/mm/dd hh:nn:ss",SystemTimeToDateTime(StCreationTime));

    FileTimeToLocalFileTime(&FtLastAccessTime ,&LftLastAccessTime);
    FileTimeToSystemTime(&LftLastAccessTime ,&StLastAccessTime);
    Edit2->Text=FormatDateTime("yyyy/mm/dd hh:nn:ss",SystemTimeToDateTime(StLastAccessTime));

    FileTimeToLocalFileTime(&FtLastWriteTime ,&LftLastWriteTime);
    FileTimeToSystemTime(&LftLastWriteTime ,&StLastWriteTime);
    Edit3->Text=FormatDateTime("yyyy/mm/dd hh:nn:ss",SystemTimeToDateTime(StLastWriteTime));
  }
  CloseHandle(hFile);


関連項目:
 ・世界協定時刻(UTC)をローカルタイムに変換
 ・TSystemTime(_SYSTEMTIME)とTDateTimeの変換

[BCB] ディレクトリが存在するか調べる(Unicode版)

引数に指定されたディレクトリが存在するかを調べる関数です。ユニコードファイル名に対応しています。

bool __fastcall DirectoryExistsW(WideString WFilename)
{
  WIN32_FIND_DATAW FindFileData;
  HANDLE hFind;

  hFind = FindFirstFileW(WFilename.c_bstr(), &FindFileData);

  if (hFind != INVALID_HANDLE_VALUE) {
    // 検索ハンドルをクローズ
    FindClose(hFind);
    if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) return true;
  }
  return false;
}

[BCB] ファイルが存在するか調べる(Unicode版)

引数に指定されたファイル名(ディレクトリも含む)が存在するかを調べる関数です。ユニコードファイル名に対応しています。

bool __fastcall FileExistsW(WideString WFilename)
{
  WIN32_FIND_DATAW FindFileData;
  HANDLE hFind;

  hFind = FindFirstFileW(WFilename.c_bstr(), &FindFileData);

  if (hFind != INVALID_HANDLE_VALUE) {
    // 検索ハンドルをクローズ
    FindClose(hFind);
    return true;
  }
  return false;
}

[BCB] 相対パスと絶対パスの変換

相対パスから絶対パスへの変換はExpandFileName。
絶対パスから相対パスへの変換はExtractRelativePath。

これらの関数を使用する前には、SetCurrentDirでベースとなるディレクトリを設定する必要がある。

AnsiString AppDir=ExtractFilePath(Application->ExeName);
if (SetCurrentDir(AppDir)) {
  Label1->Caption=ExpandFileName("../../test.txt");
}

[BCB] フォルダを削除する

RemoveDirectoryを使います。

[BCB] ファイル名の拡張子を変更する

ファイル名の拡張子を変更するにはChangeFileExt関数を使います。

#include <SysUtils.hpp>

//拡張子を取得
Filename="C:\\tmp\\test.ini";
Result=ChangeFileExt(Filename,".htm");

引数には元のファイル名と拡張子を「.」を含めた形で指定します。上の例の場合、Resultは「C:\tmp\test.htm」となります。

ChangeFileExt(Filename,"");
のようにすると拡張子を取り除くこともできます。

[BCB] ファイルの拡張子を取得する

ファイルの拡張子を取得するにはExtractFileExt関数を使います。

#include <SysUtils.hpp>

//拡張子を取得
Filename="C:\\tmp\\test.ini";
FileExt=ExtractFileExt(Filename);

関数を実行すると変数FileExtには、拡張子が「.」を含めた形で格納されます。上の例の場合はFileExtの内容は「.ini」となります。

拡張子がない場合は空の文字列が返されます。