2017-06-15 15 views
0

オーディオファイルを保存するための一時フォルダを作成しました。私の意図は、オーディオファイルを1つのファイルに結合した後、この一時フォルダを削除することです。ここでCを使用してコンテンツを削除した後にフォルダを削除する

はディレクトリdirectoryName内の一時ファイルを作成し、自分のコードの一部です:すべての一時ファイルを結合し

fileName = fileCounter.ToString() + ".wav"; 
fileCounter++; 
fileName = directoryName + "\\" + fileName; 

コードは次のとおりです。

public void Concatenate(string outputFile, List<string> sourceFiles) 
{ 
    byte[] buffer = new byte[1024]; 
    WaveFileWriter waveFileWriter = null; 
    try 
    { 
     foreach (string sourceFile in sourceFiles) 
     { 
      using (WaveFileReader reader = new WaveFileReader(sourceFile)) 
      { 
       if (waveFileWriter == null) 
       { 
        // first time in create new Writer 
        waveFileWriter = new WaveFileWriter(outputFile, reader.WaveFormat); 
       } 
       else 
       { 
        if (!reader.WaveFormat.Equals(waveFileWriter.WaveFormat)) 
        { 
         throw new InvalidOperationException("Can't concatenate WAV Files that don't share the same format"); 
        } 
       } 

       int read; 
       while ((read = reader.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        waveFileWriter.WriteData(buffer, 0, read); 
       } 
      } 
     } 
    } 
    finally 
    { 
     if (waveFileWriter != null) 
     { 
      waveFileWriter.Dispose(); 
     } 
    } 
} 

私はこのquestionからの助けがありました

ファイルを削除するコードです。

private void DeleteDirectory() 
{ 
    string[] files = Directory.GetFiles(directoryName); 
    foreach (string file in files) 
    { 
     File.Delete(file); 
    } 
    Directory.Delete(directoryName);    
} 

しかし、質問のコードは、フォルダ内のファイルのみを削除しました。しかし、私も同様にフォルダを削除したい。

+1

私が知る限り、Directory.Deleteをtrueに設定すると、含まれているすべてのファイルとサブディレクトリを削除でき、ループは必要ありません。 –

+0

簡単に答えが見つかりました:https:// stackoverflow。com/questions/1288718/how-to-delete-all-files-and-a-directory –

答えて

2

削除する前に、フォルダ内のすべてのファイルを削除する必要はありません。 Directory.Delete(directoryName,true)は、ディレクトリとその中のすべてのファイル/サブディレクトリを削除する必要があります。内部のファイルのいずれかが使用されている場合、それは投げるだろうと

とにかく、あなたは、のtry/catchでこれを囲む必要がありIOException

+0

このメソッドは、Fileのいずれかが使用中の場合は 'Exception'をスローします。これは例外を避けるために注意する必要があります – GauravKP

+0

あなたは@GauravKPです。その可能性を示すように編集しました – Pikoh

+0

@Pikoh正しいですが、 'Directory.Delete(directoryName、true)'はその中のすべてのファイルとフォルダを削除します。ただし、directoryNameの内容だけが削除されます。私はdirectoryNameも削除したいと思います。 –

1

C#のDirectory.Deleteているディレクトリを削除するために使用することができます再帰フラグとすべての内容これを使用すると、最初にすべてのファイルを手動で削除する必要はありません。

は単にDirectory.Deleteの2番目の引数にtrueを渡します

Directory.Delete(directoryName, true);   

は注意して使用してください!

0

(これは、あなたの質問には無関係であるが、それはコメントのためにあまりにも扱いにくいですので、私は答えとして投稿しています。)

を連結メソッドのコードを簡素化して半減させることができる

public void Concatenate(string outputFile, List<string> sourceFiles) 
{ 
    using (WaveFileWriter waveFileWriter = new WaveFileWriter(outputFile, reader.WaveFormat)) 
    { 
     foreach (string sourceFile in sourceFiles) 
     { 
      using (WaveFileReader reader = new WaveFileReader(sourceFile)) 
      { 
       if (reader.WaveFormat.Equals(waveFileWriter.WaveFormat)) 
        reader.CopyTo(waveFileWriter); 
       else 
        throw new InvalidOperationException("Can't concatenate WAV Files that don't share the same format"); 
      } 
     } 
    } 
} 
+0

提案をありがとう。 –

0

System.IO.Pathクラスを使用して一時フォルダを作成することを検討してください。

また、文字列の代わりにファイルとフォルダにDirectoryInfoとFileInfoを使用することを検討してください。結局、ファイルは文字列ではありません。ファイルの名前は文字列です。 DirectoryInfoとFileInfoには、あなたが作成/名前変更/移動/ファイルやフォルダを削除するか、または拡張

var tmpFolderName = Path.Combine(Path.GetRandomPathName, Path.GetRandomFileName)); 
DirectoryInfo tmpFolder = Directory.Create(tmpFolderName) 

// Tmp file name of a file in tmpFolder: 
var tmpFileName = Path.Combine(tmpFolder.Name, fileName); 

// Delete the tmp folder and everything in it: 
tmpFilder.Delete(true); 

このフォルダは、作成され充填され、削除が可能に変更したい場合は、ファイル名に問題がないことを確認なります使用のほかに誰もあなたのフォルダ名を持っていないので、誰もそれを使用しないと確信しているので、心配する必要はありません。

Path.Combineを使用すると、スラッシュ '\'を心配する必要がなくなります。あなたのコードに加えて、セパレータとしてバックスラッシュを使用しない他のシステムで使用するために移植性があります。

関連する問題