• ベストアンサー

C++ の FileCopy の設定が解りません。

C++ の FileCopy の設定が解りません。 MicroSoftのVisual Studio 2010 の Win32CLR の C++ で書いています。 練習として、単純なファイルのコピーを作ろうとしているのですが、 FileCopy の使い方が解りません。 調べていると、FileSystemObject や FileSystem との関連があると 言う事は解ったのですが、どうすればよいのかが解りません。 ????.FileCopy( "ab.txt" , "xy.txt" , True ) のようになるのかな?と思っています。 宜しくご教授下さい。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

> CopyFile ------ グローバルスコープに "CopyFile" が有りません > GetLastError -- グローバルスコープに "GetLastError" が有りません > LPCTSTR ------- 識別子"LPCTSTR" が定義されていません > DWORD --------- 識別子"DWORD" が定義されていません すいません。 「stdafx.h」に以下を追加してください。 #include <windows.h> これでエラーが無くなると思います。

Begin_7
質問者

お礼

<magicalpass>様、 当方の勘違いが色々と面倒をおかけしました。 解りやすいコードなど、大変参考/勉強になりました。 有り難うございました。

Begin_7
質問者

補足

前回の補足に一部、文字の記入ミスが有りました、すいません。 今回の#include <windows.h>を入れたら、無事に全部のエラーが消え、 コピーも、無事に出来ました。念のためコードを記しました。 // FCopy_Test_2_.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) {     bool ret = CopyFile((LPCTSTR)L"C:\\Test_File_1.txt" , (LPCTSTR)L"C:\\Test_File_1_cp.txt", false);     if (!ret) {       DWORD ErrNo = GetLastError();       printf("\nエラー番号::%d\n", ErrNo);     } else {       printf("\nコピー成功\n");     }     return 0; } 上記のコードで無事に動いています。 <magicalpass>様、 大変、長らくご指導、有り難うございました。

その他の回答 (6)

回答No.6

#4 です。 「CLR」って書いてあるから.NET環境だと思ってたのですが、ひょっとして「Win32コンソールアプリケーション」のことですか?  それなら、以下の感じで文字列の前に「L」を付ければ動きます。 #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { bool ret = ::CopyFile((LPCTSTR)L"C:\\Download\\arc.zip", (LPCTSTR)L"I:\\Download\\arc.zip", false); if (!ret) { DWORD ErrNo = ::GetLastError(); printf("\nエラー番号::%d\n", ErrNo); } else { printf("\nコピー成功\n"); } return 0; }

Begin_7
質問者

補足

補足には「画像添付」が出来ないのですね、大変失礼しました。 「Win32コンソールアプリケーション」と「CLR」を勘違いしていました、 大変申し訳ありません。 早速、下記のように新規に作成してみました。 // FCopy_Test_2_.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) {   bool ret = ::CopyFile((LPCTSTR)(L"C:\\Test_File_1.txt"), (LPCTSTR)(L"I:\\Test_File_1_cp.txt"), false);   if (!ret) {     DWORD ErrNo = ::GetLastError();     printf("\nエラー番号::%d\n", ErrNo);   } else {     printf("\nコピー成功\n");   }   return 0; } エラーの出る所は、 CopyFile ------ グローバルスコープに "CopyFile" が有りません GetLastError -- グローバルスコープに "GetLastError" が有りません LPCTSTR ------- 識別子"LPCTSTR" が定義されていません DWORD --------- 識別子"DWORD" が定義されていません L"C:\\Test_File_1.txt" ---- ')'が必要です L"C:\\Test_File_2.txt" ---- ')'が必要です 上記は'()'で囲ったら「')'が必要です」のエラーは消えました。 まだ、何か当方の勘違いがあるようですね?・・・・ 宜しくお願いします。

回答No.5

#4 です >また、「Win32 CLR」で「::」や「^」は使えるのですか? >自分のコードの方は「cut_n = ks_sd.length();」や「File_in_2.close();」の様に 「.」(ドット)で書かないとエラーになるのですが? >あと「^」も使えません。 それがVC++のCLR環境(C++/CLI)では普通ですが。 それ、ひょっとして、VC++じゃなくて、VC#を使ってるのではないですか? VC#なら「::」や「^」じゃなくて「.」になりますが。

Begin_7
質問者

補足

念のため、新規作成時の画面を添付しました。 画面の通りに「Vc++」だと思います。新規作成をすると下記の ---------------------------------------------------------------------- // abcd.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) {     return 0; } ---------------------------------------------------------------------- 上記のコードが勝手に作られています。

回答No.4

どうもVC++ 2010では文字列がうまく渡されないみたいですね。 次のようにMarshalクラスのStringToHGlobalUni関数を使ってファイル名の文字列を変換したら動くみたいですが…… CopyFileにANSI文字を渡さないといけないのかと思ったけど、そういうわけでもないみたいで…… #include "stdafx.h" using namespace System; using namespace System::Runtime::InteropServices; int main(array<System::String ^> ^args) { String^ str = L"\nエラー番号::"; // コピー元ファイル名 String^ src_fname = L"C:\\Download\\arc.zip"; char *src_name = (char*) Marshal::StringToHGlobalUni(src_fname).ToPointer(); // コピー先ファイル名 String^ dest_fname = L"I:\\Download\\arc.zip"; char *dest_name = (char*) Marshal::StringToHGlobalUni(dest_fname).ToPointer(); bool ret = ::CopyFile((LPCTSTR)src_name, (LPCTSTR)dest_name, false); if (!ret) { DWORD ErrNo = ::GetLastError(); Console::WriteLine(str + ErrNo.ToString() + L"\n"); } else { Console::WriteLine(L"\nコピー成功\n"); } Marshal::FreeHGlobal(IntPtr(src_name)); Marshal::FreeHGlobal(IntPtr(dest_name)); return 0; }

Begin_7
質問者

補足

サンプルコード、有り難うございます。 早速、新規に「Win32 CLR」で「新規プロジェクト」を作って、 「magicalpass」さんのコードをそっくり書いて試してみたのですが、 冒頭の「using namespace System;」の所で、 「error::名前は名前空間名である必要が有ります」 とのメッセージが出てしまいます。 以下、「Marshal」など、あちこちに赤いアンダー波線がでてしまいます。 また、「Win32 CLR」で「::」や「^」は使えるのですか? 自分のコードの方は「cut_n = ks_sd.length();」や「File_in_2.close();」の様に 「.」(ドット)で書かないとエラーになるのですが? あと「^」も使えません。 どこかの設定などが合わないのでしょうか?。 ファイルのコピー以外のファイルの有無チェックや テキストファイル内容の読み出し、変更、文字列の処理などはうまく動いています。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

CLRということは.NET Frameworkを使用したコピー方法と思われます。 したがって使うべきなのはSystem.Io.FileInfo.CopyToではないかと思われます。 参考URLにはサンプルコードもありますのでご確認ください。……でも何でC++のサンプルコードがVBのところに書いてあるんだ?……

参考URL:
http://msdn.microsoft.com/ja-jp/library/tsz3wx3h(v=VS.71).aspx
Begin_7
質問者

補足

お世話になります。 「.NET」が何かも解らずに「c++ win32 CLR」を書いている入門者です。 何となく、今書いているのが、 参考<http://msdn.microsoft.com/ja-jp/library/5axsfwbc(VS.80).aspx> これを「c++」で書いているようですが?うまくいきません。 単純に「batファイル」として書き出した方が早いのでしょうか?

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

こちらにソースもありますので参考にしてください http://www.monmon-dance.com/win32api/copyfile.html

Begin_7
質問者

補足

お世話になっています。 参考ソース、自分には難解で、解りません!! 申し訳ありません。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1
Begin_7
質問者

補足

お世話になります。 この辺は何度も見ているのですが、この通りに実行すると、 「error C3861: 'CopyFile': 識別子が見つかりませんでした」 とのエラー表示が出されます。 何かのインクルードが必要なのでしょうか?

関連するQ&A

専門家に質問してみよう