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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

0回答

1315閲覧

ディレクトリの中身のファイルの拡張子だけ変えた全く同じディレクトリ構を生成したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2020/12/06 12:32

編集2020/12/06 22:55

void Update();関数部の///コメント部ですが「ディレクトリのパスを入力するとディレクトリ内のファイルの拡張子が変わって全く同じディレクトリ構造のフォルダが生成される」という処理を作りたいです。そのためには ファイル名だけやディレクトリ名だけを取得する関数などを作りましたが毎回異なる場合どうすればループ構造を作れるのかわかりませんどうすればいいのでしょうか?

※ 拡張子を変更というのはffmepgによるエンコードです。

cs

1namespace MusicFile_Encoder 2{ 3 class Encorder 4 { 5 private string RootInputDir_Path; //ルートディレクトリのパス 6 private static string RootDir_Path; //ルートディレクトリ 7 8 void test(int start,int length) 9 { 10 11 // Console.WriteLine(s); 12 } 13 14 15 16 17 // ディレクトリを再帰的に走査 18 public static void Tree_Recursive(string folderPath, ref List<string> list) 19 { 20 foreach (String fname in Directory.EnumerateFiles(folderPath))//ファイルを列挙する 21 { 22 list.Add(fname); 23 } 24 25 IEnumerable<String> folders = Directory.EnumerateDirectories(folderPath);//ディレクトリを列挙 26 if (folders.Count() == 0) 27 { 28 return; 29 } 30 else 31 { 32 foreach (String dname in folders) 33 { 34 Tree_Recursive(dname, ref list); 35 } 36 } 37 } 38 39 40 //ディレクトリ名 だけを返す ファイル名の場合はファイルの名を返す 41 private static string getdirname_Path(string str) 42 { 43 string s = ""; 44 try 45 { 46 s = Path.GetDirectoryName(str); 47 }catch(System.IO.IOException e) 48 { 49 return RootDir_Path; 50 }catch (System.ArgumentException e){ 51 return RootDir_Path; 52 53 } 54 return s; 55 } 56 57 58 //一個前のディレクトリフルパスを返す 59 private static string getdirname(string str) 60 { 61 string s = Path.GetFileNameWithoutExtension(str); 62 return s; 63 } 64 65 66 67 68 //ディレクトリAをディレクトリBの中にコピーする 69 private void CopyDirectory(List<string> Path_A,string Path_B) 70 { 71 foreach(string str in Path_A) 72 { 73 Directory.Move(str,Path_B); //ファイルをPath_Bにコピーする 74 Directory.Delete(str); //コピーしたファイルを削除する 75 } 76 77 string st = getdirname(Path_B); //削除するディレクトリ名 78 string name = getdirname_Path(st); //ファイル名だけにする 79 80 string path = Path_B + name;//作成するディレクトリ名パスを作成 81 82 Directory.CreateDirectory(path); //ディレクトリを作成 83 } 84 85 86 // ファイルをディレクトリごとにまとめめて出力 87 private List<List<string>> DivideFile(List<string> FileList) 88 { 89 string t = ""; 90 List <List<string>> index = new List<List<string>>(); 91 List<string> tmp = new List<string>(); 92 bool b = false; 93 94 foreach (string i in FileList) 95 { 96 string r = getdirname_Path(i); 97 98 99 if(t != r) 100 { 101 if( b == true) 102 { 103 index.Add(new List<string>(tmp)); 104 105 106 tmp = new List<string>(); 107 } 108 t = r; 109 tmp.Add(i); 110 111 }else{ 112 tmp.Add(i); 113 } 114 115 b = true; 116 } 117 index.Add(tmp); 118 119 return new List<List<string>>(index); 120 } 121 122 // ディレクトリを移動する a を b に移動 123 private void Move(string Pa,string pb) 124 { 125 string Path_A = Pa; //Path_A 126 string Path_B = pb + "\" + getdirname(Path_A); //Path_B 127 128 Console.WriteLine("Path_A: " + Path_A); 129 Console.WriteLine("Path_B: " + Path_B); 130 131 try 132 { 133 Directory.Move(Path_A, Path_B); 134 } 135 catch (System.IO.IOException e) 136 { 137 ConsoleColor Fore_Color = ConsoleColor.DarkRed; //前景色 138 Console.Write(" "); 139 Console.Write("[ "); 140 Console.ForegroundColor = Fore_Color; //前景色を設定 141 Console.Write(" WARNING "); 142 Console.ResetColor(); //配色を元に戻す 143 Console.Write(" ]"); 144 Console.WriteLine(" " + e.Message); 145 } 146 } 147 148 149 // メイン 150 public void Update() 151 { 152 153 // ファイルパス読み込み 154 RootInputDir_Path = "C:\Users\yw325\Desktop\Music"; 155 // RootInputDir_Path = "C:\Users\yw325\Desktop\music_directory"; 156 157 RootDir_Path = getdirname(RootInputDir_Path); 158 //Console.WriteLine(RootDir_Path); 159 // ファイルパス読み込み 160 List<string> FileList = new List<string>(); //ファイルフルパスのリスト 161 Tree_Recursive(RootInputDir_Path, ref FileList); //ディレクトリを再帰的に走査 162 163 List<List<string>> FilePath = new List<List<string>>(); 164 FilePath = DivideFile(new List<string>(FileList)); //ディレクトリ別のファイルパス 165 166 167 // エンコードをかける 168 foreach (List<string> str in FilePath) 169 { 170 Encode(str); 171 } 172 173 /* 174 * ここに書きたい 175 * 176 * 177 */ 178 179 180 181 Console.WriteLine("\n\n-------------- 処理終了 --------------"); 182 Console.ReadKey(); 183 } 184 185 // --エンコードをかける関数 186 void Encode(List<string> FileList) //引数はフルパス 187 { 188 189 string DirName = getdirname(getdirname_Path(FileList[0])); 190 Directory.CreateDirectory(DirName); 191 Console.WriteLine("-------------- "+ DirName +" --------------\n"); 192 int num = 0; 193 int thread_count = FileList.Count; 194 195 using (CountdownEvent ce = new CountdownEvent(thread_count)) 196 { 197 foreach (string fpath in FileList) 198 { 199 // Console.WriteLine("ううううううう " + getdirname(fpath)); 200 //Console.WriteLine(getdirname(getdirname_Path(FileList[0]))); 201 202 203 204 205 206 string[] pool = { fpath, DirName }; //ディレクトリ名をdest_path変数に変換 207 208 //スレットプール 209 ThreadPool.QueueUserWorkItem(state => { 210 string[] state_array = (string[])state; 211 Run_Encode(state_array[0], state_array[1]); 212 213 ce.Signal();//シグナル送信 214 }, pool); //スレッドプールにする 215 num++; 216 } 217 218 //Wait 219 ce.Wait(); 220 } 221 // ------------------------------- 222 Console.Write("\n"); 223 } 224 225 226 227 /* 228 * ****************************************************************************************** 229 * 実際にエンコードする処理関数 マルチタスク 230 * ****************************************************************************************** 231 * 引数: 232 * 233 * fname : エンコードするファイル名 234 * out_name 出力ファイル名 235 * 236 * 237 */ 238 239 private static void Run_Encode(string fname, string out_name) 240 { 241 //Console.WriteLine("ああああ " + fname); 242 //Console.WriteLine("いいいいいい" + out_name); 243 244 Process proc = new Process(); //外部プログラムを起動するためのクラス 245 proc.StartInfo.FileName = "ffmpeg.exe"; //.exeを指定 246 247 248 string option = " -vn -ac 2 -ar 44100 -ab 320.2k -f wav "; //オプション 249 const string dc = "\""; //ダブルクォート 250 string TitleName = getdirname(fname) + ".wav"; //出力ファイル名 251// Console.WriteLine("いいいいいいいい " +TitleName); 252 253 //string DirName = Path.GetFileName(Path.GetDirectoryName(out_name)); //ディレクトリ名を取得 254 string DirName = out_name; //ディレクトリ名を取得 255 //Console.WriteLine("あああ" + DirName); 256 257 //エンコードファイル(フルパス), 出力ファイル名 258 //proc.StartInfo.Arguments = " -y -i " + dc + fname + dc + option + dc + DirName + "\" + TitleName + dc; 259 proc.StartInfo.Arguments = " -y -i " + dc + fname + dc + option + dc + DirName +"\"+ TitleName + dc; 260 // Console.WriteLine(proc.StartInfo.Arguments); 261 proc.StartInfo.UseShellExecute = false; 262 proc.StartInfo.CreateNoWindow = true; 263 proc.Start(); 264 proc.WaitForExit(); 265 266 267 268 // ---------------------- 画面表示 269 string file = System.IO.Path.GetFileName(fname); 270 if (proc.ExitCode != 0) 271 { 272 // ERROR 273 ConsoleColor Fore_Color = ConsoleColor.Red; //前景色 274 Console.ForegroundColor = Fore_Color; //前景色を設定 275 276 Console.Write("[ ERROR ]"); 277 Console.ResetColor(); //配色を元に戻す 278 Console.WriteLine(" " + file); 279 280 } 281 else 282 { 283 //成功  284 // ConsoleColor Back_Color = ConsoleColor.DarkGreen; //背景色 285 ConsoleColor Fore_Color = ConsoleColor.DarkGreen; //前景色 286 Console.Write(" "); 287 Console.Write("[ "); 288// Console.BackgroundColor = Back_Color; //背景色を設定 289 Console.ForegroundColor = Fore_Color; //前景色を設定 290 Console.Write(" OK! "); 291 Console.ResetColor(); //配色を元に戻す 292 Console.Write(" ]"); 293 Console.WriteLine(" "+file); 294 295 } 296 297 298 } 299 300 } 301 302 class Program 303 { 304 static void Main(string[] args) 305 { 306 Encorder enc = new Encorder(); 307 308 enc.Update(); 309 310 311 312 313 // Console.ReadKey(); 314 } 315 } 316} 317

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

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

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

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

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

y_waiwai

2020/12/06 12:36

質問の日本語がわからない なにをどうしたいのか具体例なんか挙げれないかな
退会済みユーザー

退会済みユーザー

2020/12/06 12:42

音楽ファイルのなどのデータの塊を選択する時そのディレクトリの中身が例えば.mp3になってディレクトリ構造が全く同じなフォルダが生成されてほしいのです。
退会済みユーザー

退会済みユーザー

2020/12/06 12:59

400 近く質問をしていて、こういう日本語レベルで訳が分からない質問をするのはどういうことですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問