- ベストアンサー
C言語
レジストリのキーから値を取得し、その取得した値の中フォルダのファイルの有無を調べあるなら他のフォルダにそのファイルをコピーしたいのですがわかりません。。。レジストリのオープンとキーの取得はわかるんですが。 例 ルートキーHKEY_LOCAL_MACHINE\SOFTWARE\HRPS\BPSS 値の名前 PathName キーの値 c:\program\HRPS このキーの値からc:\program\HRPS の中のファイル(file.c)をチェックし、あれば別のフォルダc:\program\fileの中にコピーしたいんです><
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>printf("%s",szPathname)で >表示内容が「c:\program\HRPS」になりますか? はい、そうなるはずです。 >そして連結したいときは >strcat("szpathname",\\file.c)? >strcat(c:\program\HRPS,\\file.c)だと自分で入力しないといけないのでどうやったらいいでしょうか><?」 >strcat(szpathname,\\file.c) えーと、3つともハズレです。 配列と文字列とポインタは理解出来てますか? strcatの宣言はこうなってます。 char *strcat(char *s1, const char *s2); 動作は…、 char型ポインタs1が指す文字列の末尾に char型ポインタs2が指す文字列を連結し、 戻り値としてs1のポインタを返す。 です。 (char *s2の前に付いてるconstはs2の内容を変更出来なくするという意味です。 まぁ、気にしなくていいですね。) なので、正解はこうなりますね。 strcat( szPathName, "\\file.c" ); ※szPathNameはchar型配列szPathName[MAX_PATH]の先頭アドレスを表し、 "\\file.c"は文字列"\\file.c"の先頭アドレスを表しています。 んー、わかりずらかったらすいません。
その他の回答 (4)
- -ray-
- ベストアンサー率60% (3/5)
#1です。Win32APIを使った方法は書かれてるので、 C言語のみでのアドバイスです。 1.フォルダパスを取得した後、任意のファイル名を繋げて絶対パスのファイル名とする。 難しく考えなくてもただ単なる文字列の結合です。 strcat,wsprintfなどの関数を使ったり、又は、自分で結合すればよいです。 質問者様の例を使用するなら、 c:\program\HRPSに\とfile.cを結合するだけですね。 2.別のフォルダパス+ファイル名で先にオープンしたファイルの内容をそのまま書き込み。 fopen関数を使って1で作成した絶対パスのファイルを開く。(これが失敗すればファイル無し。) あれば、1で作成した絶対パスのファイルを開いたのとは別にもう一つコピー先のファイル名を書き込みモードで開く。 後は、先に開いた方からfread関数などで内容を読み出し、その内容をfwrite関数などで後に開いたコピー先に書き込む。 これで実現出来ると思います。
- wolfberry
- ベストアンサー率23% (3/13)
こういうことでしょうか?ファイルがなければどうせコピーで失敗するので、存在確認は省きました。 char szFiles[] = "abc.dat,xyz.dat"; // コピーするファイル名一覧 char* lpszToken; // フォルダパスの取得 DWORD dwValueType, cbPathName; char szPathName[MAX_PATH]; HKEY hKey; RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\HRPS\\BPSS", 0, KEY_READ, &hKey); RegQueryValueEx(hKey, "PathName", NULL, &dwValueType, (LPBYTE)szPathName, &cbPathName); RegCloseKey(hKey); lpszToken = strtok(szFiles, ","); // カンマ区切りでファイル名を抽出 while (lpszToken) { // 各ファイル毎にコピー // 新旧ファイルパスの生成 char szFilePath[MAX_PATH]; char szNewFilePath[MAX_PATH]; wsprintf(szFilePath, "%s\\%s", szPathName, lpszToken); wsprintf(szNewFilePath, "%s\\%s", "c:\\ftproot", lpszToken); // ファイルのコピー if (!CopyFile(szFilePath, szNewFilePath, TRUE)) { // エラーの場合 DWORD dwError = GetLastError(); switch (dwError) { case ERROR_FILE_NOT_FOUND: printf("\"%s\" not found\n", szFilePath); break; case ERROR_FILE_EXISTS: printf("\"%s\" already exists\n", szFilePath); break; default: printf("errorコード=%d\n", dwError); } } lpszToken = strtok(NULL, ","); // 次のファイルの抽出 }
- real_neo
- ベストアンサー率12% (10/83)
ファイルを探すには、 Win32APIのFindFirstFile →戻り値がINVALID_HANDLE_VALUEならファイルなし Cライブラリのfopen →オープンできなければファイルなし ファイルをコピーするには Win32APIのCopyFile ですね。
- -ray-
- ベストアンサー率60% (3/5)
レジストリのキーからフォルダパスを取得した後、 任意のファイル名を繋げて絶対パスのファイル名として、 そのファイル名でオープン出来ればファイル有り。 オープン出来なければファイル無し。 ということで、ファイル有れば別のフォルダパス+ファイル名で先にオープンしたファイルの内容をそのまま書き込み。では駄目ですか?
補足
おはようございます。やりたいことがわかったのですがプログラムににすると 1.フォルダパスを取得した後、 任意のファイル名を繋げて絶対パスのファイル名として、2.別のフォルダパス+ファイル名で先にオープンしたファイルの内容をそのまま書き込み。 1.2がどうすればわかりません。アドバイスお願いします。
補足
聞きたいのですが // フォルダパスの取得 DWORD dwValueType, cbPathName; char szPathName[MAX_PATH]; HKEY hKey; RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\HRPS\\BPSS", 0, KEY_READ, &hKey); RegQueryValueEx(hKey, "PathName", NULL, &dwValueType, (LPBYTE)szPathName, &cbPathName); RegCloseKey(hKey); でレジストリにキーの値を取得できますがこの値を表示させたいなら printf("%s",szPathname)で 表示内容が「c:\program\HRPS」になりますか? そして連結したいときは strcat("szpathname",\\file.c)? strcat(c:\program\HRPS,\\file.c)だと自分で入力しないといけないのでどうやったらいいでしょうか><?」 strcat(szpathname,\\file.c)