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 を使って独自の確認メッセージを表示して処理すると良いでしょう。
以上の回答ですべての問題が解決できない場合は、お手数ですが追加でコメントをください。