FileSystem::Copyの挙動について
しぐれん  2015/06/25(Thu) 09:14
FileSystem::Copyの挙動についてです。
オプションを指定した時の挙動で、気になるところがあります。

Fail_if_exists_TEST
コピー先のフォルダの同名ファイルの有無に関わらずfalseを返し、ファイルがコピーされません。

Confirm_if_exists_TEST
同名ファイルがある場合ダイアログでの選択に従って適切にコピーされますが、
3つの選択肢のどれを選んだ場合でもtrueが返ってきます。

また、System::Update()の外で呼び出した場合、アプリケーションが右上の×ボタンで終了できなくなりました。
Fail_if_exists_TESTでは問題がなかったので、ダイアログ関連だと思います。
記事編集
しぐれん  2015/06/25(Thu) 09:15
以下、今回の再現コードです。

# include <Siv3D.hpp>
namespace fs = s3d::FileSystem;
const s3d::FilePath a_txt = L"a.txt";
const s3d::FilePath folder_name = L"folder/";
void Create_a_text(const s3d::FilePath& f_name)
{
s3d::TextWriter text(f_name);
}
void Delete_a_text()
{
fs::Remove(a_txt);
}
void Create_folder_a_txt2(const s3d::FilePath& f_name)
{
const auto folder = fs::CurrentPath() + folder_name;
fs::CreateDirectories(folder);
const auto file_path = folder + f_name;
// 空のファイルを作成しておく
s3d::TextWriter text(file_path);
}

bool Confirm_if_exists_TEST(const s3d::FilePath& file_name)
{
// コピーが可能な状況の場合、ダイアログでの選択に関わらずtrueが返ってきてしまう
return fs::Copy(
folder_name + file_name,
fs::CurrentPath(),
s3d::CopyOption::Confirm_if_exists
);
}

bool Fail_if_exists_TEST(const s3d::FilePath& file_name)
{
const auto in = folder_name + file_name;
bool result = true;
// ディレクトリ直下の同名ファイルの有無にかかわらず、copyに失敗しfalseが返ってきてしまう
result = fs::Copy(in, fs::CurrentPath(), s3d::CopyOption::Fail_if_exists);
return result;
}
void Main()
{
const Font font(10);

s3d::String str;

//Create_a_text(a_txt);
Create_folder_a_txt2(a_txt);
str += L"Fail_if_exists_TEST 戻り値";
if (Fail_if_exists_TEST(a_txt)) {
str += L"true";
}
else{
str += L"false";
}
bool flag = false;

// updateの外でコピーダイアログが呼ばれると、終了が正常に行えなくなってしまう
while (System::Update() )
{
if (!flag){
str += L"\nConfirm_if_exists_TEST 戻り値";
if (Confirm_if_exists_TEST(a_txt))
{
str += L"true";
}
else{
str += L"false";
}
flag = true;
}
font(str).draw();

Circle(Mouse::Pos(), 50).draw({ 255, 0, 0, 127 });

}
}
編集
Reputeless  2015/06/25(Thu) 12:37
ご報告ありがとうございます。

[1]
>Fail_if_exists_TEST
>コピー先のフォルダの同名ファイルの有無に関わらずfalseを返し、ファイルがコピーされません。

コードの誤りです。
FileSystem::Copy() はコピー先をファイル名を含めて指定する必要があります。
テストコードでは、コピー先が FileSystem::CurrentPath() でディレクトリの指定になっているため失敗します。

[2]
>Confirm_if_exists_TEST
>3つの選択肢のどれを選んだ場合でもtrueが返ってきます。

選択結果をプログラムで判断できないため、このような仕様になっています。
改善できないか検討します。

>また、System::Update()の外で呼び出した場合、アプリケーションが右上の×ボタンで終了できなくなりました。

Siv3D のバグです。
今後のバージョンで修正します。

現時点で問題を回避するには、GUI を使って独自の確認メッセージを表示して処理すると良いでしょう。

以上の回答ですべての問題が解決できない場合は、お手数ですが追加でコメントをください。
編集
しぐれん  2015/06/25(Thu) 14:17
返信ありがとうございます。
[1]はコードを修正することで正しく動作しました。

[2]に関しても独自メッセージで対処しようと思います。
編集
Reputeless  2015/06/25(Thu) 14:26
[2] に追記です。
MessageBox::Show() で確認すると簡単です。
編集
件名
Re: FileSystem::Copyの挙動について
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -