プロが教えるわが家の防犯対策術!

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

A 回答 (7件)

> CopyFile ------ グローバルスコープに "CopyFile" が有りません


> GetLastError -- グローバルスコープに "GetLastError" が有りません

> LPCTSTR ------- 識別子"LPCTSTR" が定義されていません
> DWORD --------- 識別子"DWORD" が定義されていません

すいません。
「stdafx.h」に以下を追加してください。

#include <windows.h>

これでエラーが無くなると思います。

この回答への補足

前回の補足に一部、文字の記入ミスが有りました、すいません。

今回の#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>様、
大変、長らくご指導、有り難うございました。

補足日時:2010/05/05 22:39
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/05/05 22:44

#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;
}

この回答への補足

補足には「画像添付」が出来ないのですね、大変失礼しました。

「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" ---- ')'が必要です
上記は'()'で囲ったら「')'が必要です」のエラーは消えました。

まだ、何か当方の勘違いがあるようですね?・・・・

宜しくお願いします。

補足日時:2010/05/05 21:59
    • good
    • 0

#4 です



>また、「Win32 CLR」で「::」や「^」は使えるのですか?
>自分のコードの方は「cut_n = ks_sd.length();」や「File_in_2.close();」の様に
「.」(ドット)で書かないとエラーになるのですが?
>あと「^」も使えません。

それがVC++のCLR環境(C++/CLI)では普通ですが。

それ、ひょっとして、VC++じゃなくて、VC#を使ってるのではないですか?
VC#なら「::」や「^」じゃなくて「.」になりますが。

この回答への補足

念のため、新規作成時の画面を添付しました。

画面の通りに「Vc++」だと思います。新規作成をすると下記の
----------------------------------------------------------------------
// abcd.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{

    return 0;
}
----------------------------------------------------------------------
上記のコードが勝手に作られています。

補足日時:2010/05/05 21:15
    • good
    • 0

どうも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;
}

この回答への補足

サンプルコード、有り難うございます。
早速、新規に「Win32 CLR」で「新規プロジェクト」を作って、
「magicalpass」さんのコードをそっくり書いて試してみたのですが、
冒頭の「using namespace System;」の所で、
「error::名前は名前空間名である必要が有ります」
とのメッセージが出てしまいます。
以下、「Marshal」など、あちこちに赤いアンダー波線がでてしまいます。

また、「Win32 CLR」で「::」や「^」は使えるのですか?
自分のコードの方は「cut_n = ks_sd.length();」や「File_in_2.close();」の様に
「.」(ドット)で書かないとエラーになるのですが?
あと「^」も使えません。

どこかの設定などが合わないのでしょうか?。
ファイルのコピー以外のファイルの有無チェックや
テキストファイル内容の読み出し、変更、文字列の処理などはうまく動いています。

補足日時:2010/05/05 20:21
    • good
    • 0

CLRということは.NET Frameworkを使用したコピー方法と思われます。


したがって使うべきなのはSystem.Io.FileInfo.CopyToではないかと思われます。

参考URLにはサンプルコードもありますのでご確認ください。……でも何でC++のサンプルコードがVBのところに書いてあるんだ?……

参考URL:http://msdn.microsoft.com/ja-jp/library/tsz3wx3h …

この回答への補足

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

補足日時:2010/05/05 14:19
    • good
    • 0

こちらにソースもありますので参考にしてください



http://www.monmon-dance.com/win32api/copyfile.html

この回答への補足

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

補足日時:2010/05/05 14:11
    • good
    • 0

CopyFile


http://msdn.microsoft.com/ja-jp/library/cc429185 …

こちらでしょうか

この回答への補足

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

補足日時:2010/05/05 12:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!