using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace GetADoc
{
class RunBatch
{
//ファイル名に使用不可の文字が含まれている場合の処理
public static string NameCalibration(string inFileName)
{
string[] charsToRemove = new string[] { @"\", ".", "/", ":", "*", "?", "<", ">", "|" };
foreach (var allNg in charsToRemove)
{
inFileName = inFileName.Replace(allNg, string.Empty);
}
return inFileName;
}
//先に同名フォルダが存在すれば削除(エラー回避のため)
public static void deleteFolder(string filePath, string fileName, bool icon, bool sepa)
{
File.Delete(filePath + fileName + ".adoc");
File.Delete(System.IO.Path.Combine(filePath, "config.adoc"));
if(sepa == true)
{
File.Delete(System.IO.Path.Combine(filePath, "IncDoc.adoc"));
}
if (Directory.Exists(System.IO.Path.Combine(filePath, "Images")))
{
Directory.Delete(System.IO.Path.Combine(filePath, "Images"), true);
}
if (Directory.Exists(System.IO.Path.Combine(filePath, "icons")) && icon == true)
{
Directory.Delete(System.IO.Path.Combine(filePath, "icons"), true);
}
if (Directory.Exists(System.IO.Path.Combine(filePath, "Sub_First")) && sepa == true)
{
Directory.Delete(System.IO.Path.Combine(filePath, "Sub_First"), true);
}
if (Directory.Exists(System.IO.Path.Combine(filePath, "Sub_Second")) && sepa == true)
{
Directory.Delete(System.IO.Path.Combine(filePath, "Sub_Second"), true);
}
}
//バッチファイルの実行
public static void runBatch(bool icon, bool screen, bool sepa, string fileName, string filePath)
{
//テンポラリフォルダの作成
var tempPath = TemporaryFolder.MakeTempFolder();
//コンソール呼び出し
ProcessStartInfo processStartInfo = new ProcessStartInfo();
string stCurrentDir = System.IO.Directory.GetCurrentDirectory();
processStartInfo.FileName = System.IO.Path.Combine(stCurrentDir, "getADoc.Data", "getADoc.bat");
processStartInfo.CreateNoWindow = true; // コマンドプロンプトを非表示
processStartInfo.UseShellExecute = false; // シェル機能オフ
//チェックボックスの状況に応じて引数を指定
processStartInfo.Arguments = "";
if (icon == true)//Iconsチェックボックスがオンのとき
{
processStartInfo.Arguments += "/Icons ";
}
if (screen == true)//SCREEN Logoチェックボックスがオンのとき
{
processStartInfo.Arguments += "/SCREEN ";
}
if (sepa == true)//分割ドキュチェックボックスがオンのとき
{
processStartInfo.Arguments += "/SepaDoc ";
}
var pathAndName = System.IO.Path.Combine(tempPath, fileName);
processStartInfo.Arguments += pathAndName;
//GetADoc.batを実行
Process process = Process.Start(processStartInfo);
process.WaitForExit();
process.Close();
//指定されたフォルダに生成物を移動
RunBatch.MoveProduct(icon, sepa, fileName, tempPath, filePath);
//テンポラリフォルダの消去
TemporaryFolder.DeleteTempFolder(tempPath);
}
//生成物を指定先フォルダへ移動
static public void MoveProduct(bool icon, bool sepa,
string fileName, string tempPath, string filePath)
{
/*
個別移動ではなく、フォルダ全体を移動した方がよいが、とりあえずそのまま。理由:内部コマンドで生成物が増えたらまた追加修正が必要である。
*/
File.Move(System.IO.Path.Combine(tempPath, fileName + ".adoc"), filePath + fileName + ".adoc");
File.Move(System.IO.Path.Combine(tempPath, "config.adoc"), System.IO.Path.Combine(filePath, "config.adoc"));
MoveDirectory(System.IO.Path.Combine(tempPath, "Images"), System.IO.Path.Combine(filePath, "Images")); // Directory.Move -> local MoveDirectory
if (icon == true)
{
MoveDirectory(System.IO.Path.Combine(tempPath, "icons"), System.IO.Path.Combine(filePath, "icons"));// Directory.Move -> local MoveDirectory
}
if (sepa == true)
{
File.Move(System.IO.Path.Combine(tempPath, "IncDoc.adoc"), System.IO.Path.Combine(filePath, "IncDoc.adoc"));
MoveDirectory(System.IO.Path.Combine(tempPath, "Sub_First"), System.IO.Path.Combine(filePath, "Sub_First"));// Directory.Move -> local MoveDirectory
MoveDirectory(System.IO.Path.Combine(tempPath, "Sub_Second"), System.IO.Path.Combine(filePath, "Sub_Second"));// Directory.Move -> local MoveDirectory
}
}
///
/// ディレクトリを移動する。
///
/// 移動するディレクトリ
/// 移動先のディレクトリ
/*
ref: https://johobase.com/copy-directory-csharp/ [ディレクトリ(フォルダー)をコピーする [C#]]
最後に追加して、移動元のディレクトリをサブディレクトリ、ファイルを含めて削除
Directory.Delete(sourceDirName, true);
*/
public static void MoveDirectory(string sourceDirName, string destDirName)
{
// コピー先のディレクトリがないかどうか判定する
if (!Directory.Exists(destDirName))
{
// コピー先のディレクトリを作成する
Directory.CreateDirectory(destDirName);
}
// コピー元のディレクトリの属性をコピー先のディレクトリに反映する
File.SetAttributes(destDirName, File.GetAttributes(sourceDirName));
// ディレクトリパスの末尾が「\」でないかどうかを判定する
if (!destDirName.EndsWith(Path.DirectorySeparatorChar.ToString()))
{
// コピー先のディレクトリ名の末尾に「\」を付加する
destDirName = destDirName + Path.DirectorySeparatorChar;
}
// コピー元のディレクトリ内のファイルを取得する
string[] files = Directory.GetFiles(sourceDirName);
foreach (string file in files)
{
// コピー元のディレクトリにあるファイルをコピー先のディレクトリにコピーする
File.Copy(file, destDirName + Path.GetFileName(file), true);
}
// コピー元のディレクトリのサブディレクトリを取得する
string[] dirs = Directory.GetDirectories(sourceDirName);
foreach (string dir in dirs)
{
// コピー元のディレクトリのサブディレクトリで自メソッド(CopyDirectory)を再帰的に呼び出す
MoveDirectory(dir, destDirName + Path.GetFileName(dir));
}
Directory.Delete(sourceDirName, true);// 追加: 最後に元のフォルダを削除する
}
}
}