
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>
これでエラーが無くなると思います。
この回答への補足
前回の補足に一部、文字の記入ミスが有りました、すいません。
今回の#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>様、
大変、長らくご指導、有り難うございました。
<magicalpass>様、
当方の勘違いが色々と面倒をおかけしました。
解りやすいコードなど、大変参考/勉強になりました。
有り難うございました。
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;
}
この回答への補足
補足には「画像添付」が出来ないのですね、大変失礼しました。
「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#なら「::」や「^」じゃなくて「.」になりますが。
この回答への補足
念のため、新規作成時の画面を添付しました。
画面の通りに「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;
}
この回答への補足
サンプルコード、有り難うございます。
早速、新規に「Win32 CLR」で「新規プロジェクト」を作って、
「magicalpass」さんのコードをそっくり書いて試してみたのですが、
冒頭の「using namespace System;」の所で、
「error::名前は名前空間名である必要が有ります」
とのメッセージが出てしまいます。
以下、「Marshal」など、あちこちに赤いアンダー波線がでてしまいます。
また、「Win32 CLR」で「::」や「^」は使えるのですか?
自分のコードの方は「cut_n = ks_sd.length();」や「File_in_2.close();」の様に
「.」(ドット)で書かないとエラーになるのですが?
あと「^」も使えません。
どこかの設定などが合わないのでしょうか?。
ファイルのコピー以外のファイルの有無チェックや
テキストファイル内容の読み出し、変更、文字列の処理などはうまく動いています。
No.3
- 回答日時:
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ファイル」として書き出した方が早いのでしょうか?
No.2
- 回答日時:
No.1
- 回答日時:
この回答への補足
お世話になります。
この辺は何度も見ているのですが、この通りに実行すると、
「error C3861: 'CopyFile': 識別子が見つかりませんでした」
とのエラー表示が出されます。
何かのインクルードが必要なのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列をnビットシフトする
-
3桁区切(コンマ)記号をつけ...
-
double型の値をchar配列に変換...
-
【C言語】テキストファイル内の...
-
CStringをwchar_tに変換したい
-
Microsoft OfficeをDDEで操作
-
fgetsなどのときのstdinのバッ...
-
バイナリファイルをコピーする...
-
制御の方法
-
const unsigned char *Ptn
-
ランダムな英文字の文字列作成
-
RGB→YUV変換のプログラム
-
文字列ポインタを結合
-
C言語のfor文です。 繰り返しの...
-
C言語 バイナリファイルをfloa...
-
int型のchar型への代入について
-
入力された文字列から整数だけ...
-
javaでunsignedは使えないので...
-
for文 アスタリスクで形を作る
-
文字を16進変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体の各メンバにfor文からア...
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
間接参照のレベルが異なっています
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
charからLPTSTRへの変換方法
-
ネットワークにつながっている...
-
'const char *' 型は 'char *' ...
-
テキストデータをそのままバイ...
-
c言語でユーザ関数を利用して入...
-
atoi( ) の反対をやりたい
-
間接操作のレベルとは
-
-'0'の意味について
-
double型の値をchar配列に変換...
-
Linuxでフォルダ内全ファイル名...
-
配列をnビットシフトする
-
型変換
おすすめ情報