質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

1回答

1547閲覧

GetCurrentDirectoryを使用してCopyFile関数

mercurian-teto

総合スコア75

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2019/01/04 08:24

このサイトを参考にしてcopyfile関数のサンプルを作成しました。
したのPath2とPath3でcopyfile関数を行っても正常に動作しません。
messagebox関数では絶対パスは正しく表示されたのですが、
回答お願いします。

#include <windows.h> #include <stdio.h> #include<tchar.h> #include <shlwapi.h> #pragma comment(lib, "shlwapi.lib") #define MSG(m) {\ MessageBoxA(NULL,m,NULL,MB_OK);} //ウィンドウハンドル HWND hwnd; //インスタンスハンドル HINSTANCE hinst; //ウィンドウ横幅 #define WIDTH 500 #define HEIGHT 300 TCHAR Path[260]; TCHAR Path2[260]; TCHAR Path3[260]; TCHAR copy[260]; TCHAR paste[260]; LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { char buf[1000]; static HANDLE h; switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_LBUTTONDOWN: h = CreateFile("test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (h != INVALID_HANDLE_VALUE) { MSG("ファイル作成に成功しました"); CloseHandle(h); //ファイルをtest2という名前で同じ階層にコピー if (!CopyFile("test.txt", "test2.txt", FALSE)) { MSG("copyfile関数失敗"); } //ディレクトリ作成 CreateDirectory("temp", NULL); if (!MoveFile("test2.txt", "./temp/test2.txt")) { MSG("movefile関数失敗"); } GetCurrentDirectory(sizeof Path, Path); MSG(Path); _stprintf_s(Path2, sizeof(Path2)/sizeof(Path2[0]), "%s\test.text" ,Path); MSG(Path2) _stprintf_s(Path3, sizeof(Path3) / sizeof(Path3[0]), "%s\tempg",Path); MSG(Path3) if (!CopyFile(Path2, Path3, FALSE)) { MSG("getcurrentdirectoryによるcopyfile関数失敗"); } } return 0; } return DefWindowProc(hwnd, msg, wp, lp); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { MSG msg; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WinProc; wc.cbClsExtra = wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hCursor = wc.hIcon = NULL; wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszClassName = "test"; wc.lpszMenuName = NULL; if (!RegisterClass(&wc)) { MSG("クラスの登録失敗"); return -1; } //インスタンスハンドル hinst = hInstance; hwnd = CreateWindowA("test", "テストウィンドウ", WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, 0, 0, 400, 400, NULL, NULL, hInstance, NULL); if (hwnd == NULL) { MSG("ウィンドウ作成失敗"); return -1; } //エラーチェック用変数 int check; while (check = GetMessage(&msg, NULL, 0, 0)) { if (check == -1) { break; } DispatchMessage(&msg); } //クラス解放 UnregisterClass("test", hinst); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/01/04 08:41

正常に動作しないとはどうなるんでしょう。 関数が失敗すると言うならlasterrorを取ってきてそれを提示しましょう
guest

回答1

0

ベストアンサー

以下の部分

C

1_stprintf_s(Path2, sizeof(Path2)/sizeof(Path2[0]), "%s\test.text" ,Path);

が、最初に CreateFile で作成したファイルのことを指すのであれば、

C

1_stprintf_s(Path2, sizeof(Path2)/sizeof(Path2[0]), "%s\test.txt" ,Path);

こうなりますね。

とは言いつつも相対パスを前提としたコードは予想外の不具合が発生する原因となるので、プログラム上で扱うパスは絶対パスで扱うのがおすすめですね。利用者が指定するパス(設定ファイルに設定するようなものや画面で入力されるもの)は相対パスを受け入れておいて、プログラム上では相対パスを絶対パスに変換してからファイルの操作を処理した方が良いです。

投稿2019/01/05 07:02

編集2019/01/05 07:50
atata0319

総合スコア881

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問