検索条件
全12件
(2/3ページ)
GetLocalTimeで取得できるようです。
typedef struct _SYSTEMTIME { WORD wYear; // 現在年 WORD wMonth; // 現在月 WORD wDayOfWeek; // 現在の曜日 WORD wDay; // 現在日 WORD wHour; // 現在時 WORD wMinite; // 現在分 WORD wSecond; // 現在秒 WORD wMilliseconds; // 現在のミリ秒 } SYSTEMTIME;
SYSTEMTIME st; ::GetLocalTime( &st ); CString sysDate, sysTime; // yyyy/MM/dd形式の文字列生成 sysDate.Format( _T("%04d/%02d/%02d", st.wYear, st.wMonth, st.wDay) ); // hh:mm:ss形式の文字列生成 sysTime.Format( _T("%02d:%02d:%02d", st.wHour, st.wMinite, st.wSecond) );
Unicodeプロジェクト上の文字列変換について。
_tcscpy_sを使えばいいようです。
CString str = _T("foobar"); // 変換元CString文字列 TCHAR* tcharStr = new TCHAR[ str.GetLength() + 1]; // 変換先TCHAR文字列 _tcscpy_s( tcharStr, str.GetLength() + 1, str );
そのまま代入できるようです。
TCHAR tcharStr[] = _T("foobar"); // 変換元TCHAR文字列 CString str = tcharStr; // 変換先CString文字列
下記の例ではPathRemoveFileSpecが成功すれば(trueを返せば)lptStrには最終的に"C:\foo\bar"が入ります。
LPTSTR lptStr[] = _T("C:\\foo\\bar\\baz.quux"); ::PathRemoveFileSpec( lptStr );
指定されたファイル名のファイルが存在する場合にtrueを返す。
ただし、ディレクトリのパスが与えられた場合、ディレクトリが存在してもfalseを返す。
CFileFind find;
CString filePath = _T("C:\\foo.bar");
if( find.FindFile( filePath ) ){
// ファイルが存在
}
以下の例ではでファイル名の条件を指定。
CFileFind find; CString dirPath = _T("C:\\foo\\bar"); dirPath += _T("*.txt"); // ファイルの条件 if( find.FindFile( dirPath ) ){ // while( find.FindNextFile() ) // ※間違い※これだと処理出来るファイルが実際の数より1つ少ない bool flag; do{ flag = find.FindNextFile(); // *.txtファイルが存在したときの処理 }while( flag ); // これなら対象ファイル全てが処理出来る }
CString path = _T("C:\\foo.bar"); if( ::PathFileExists( path ) && !::PathIsDirectory( path ) ){ // 指定されたパスにファイルが存在、かつディレクトリでない }else if( ::PathFileExists( path ) ){ // 指定されたパスがディレクトリである }
FindFirstFileを利用してもファイル・フォルダの存在確認にできるらしい。が、ルートディレクトリは検出できないっぽい。
上記のような関数を知らなかった為こんなものを作ってしまった。PathIsDirectory関数と(たぶんほぼ)等価なはず。
// 引数で与えられたフォルダのパスが存在するかを確認 // param: folderPath(参照渡し): フォルダのパス(最後の\記号はつけない) // return: true: フォルダが存在 / false: フォルダが存在しない bool isFolderExist( CString &folderPath ){ HANDLE hFind; WIN32_FIND_DATA FindFileData; hFind = ::FindFirstFile( folderPath, &FindFileData ); if( FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY ){ // 引数のパスが正しい(フォルダが存在) return true; } // フォルダが存在しなかった場合、もしくはルートディレクトリを指定していた場合 // ルートディレクトリならfolderPathの長さは2になるはず(C:)など if( folderPath.GetLength() == 2 ){ TCHAR szBuff[125]; // 4*26 + 1 ::GetLogicalDriveStrings( sizeof(szBuff), szBuff ); for( int i = 0; i < 125 /* szBuffの配列長 */; i = i+4 ){ if( szBuff[i] == folderPath.MakeUpper().GetAt(0) && ':' == folderPath.GetAt(1) ){ // 指定されたルートディレクトリのドライブレターが有効なドライブであった場合 return true; } } } return false; }
ファイルの末尾に受け取ったCString文字列を書き込むという関数作成時のメモ。まー、ログを簡単に出力する為の関数です。
bool underwrite( CString& str ){ CStdioFile file; CString filePath = _T(".\\foo.bar"); // ファイルを書込専用、ほかのプロセスからは書込不可、 // ファイルがなければ作成し、あればそのファイルを読み込む if( file.Open( filePath, CFile::modeWrite | CFile::shareDenyWrite | CFile::modeCreate | CFile::modeNoTruncate ) ){ // ファイルオープン成功 // ポインタをファイルの末尾に移動 file.SeekToEnd(); // 文字列書込 file.WriteString( str ); // ファイルを閉じる file.Close(); }else{ return false; } return true; }
上記のようなプログラムを組んだのだが、どういうわけか上手く日本語が書き込めない。
「0123あいうabc」のような文字列を与えた場合、ファイルに出力されるのは「0123」となってしまう。
原因はWriteStringがロケール依存関数だった為。WriteStringが呼ばれる前に以下を呼んでやる必要がある。
// #include "locale.h" _tsetlocale( LC_ALL, _T("") ); //システム既定のロケールに設定 _tsetlocale( LC_ALL, _T("japanese") ); //日本語の場合