2011-12-23 20 views
3

、私は、ファイルがもはや 削除する前にScalaファイルを公開する必要がありますか?以下のコードで

val file = "myfile.csv" 
//for (line <- Source.fromFile(file).getLines()) { } 
new File(file).delete() 

を削除されるループのためにもしそうなら、私は呼び出すべきであるクローズ機能のいくつかの種類があるコメントを解除した場合?

+0

あなたはどのプラットフォームにいますか? –

+0

Windows 7 64ビット – deltanovember

+4

Windowsはファイルを開くときにファイルをロックし、削除などの他の操作を防止します。あなたは正しいです、あなたは明示的にファイルを閉じる必要があります。 –

答えて

4

あなたが呼び出すべきであることを近くのいくつかの並べ替えがあります:

val file = "myfile.csv" 
val source = Source.fromFile(file) 
for (line <- source.getLines()) { } 
source.close 
new File(file).delete 

が、これは少し面倒ですが。あなたは

source.getLines().foreach{ line => } 

としてループのために書き換える場合は、その後

class CloseAfter[A <: { def close(): Unit }](a: A) { 
    def closed[B](f: A => B) = try { f(a) } finally { a.close } 
} 
implicit def close_things[A <: { def close(): Unit }](a: A) = new CloseAfter(a) 

、今、あなたのコードは、あなたがそれに多くをやっている場合の利益となり

val file = "myfile.csv" 
Source.fromFile(file).closed(_.foreach{ line => }) 
new File(file).delete 

(になることができますあなたのコードの中で、あるいはあなたが既に役に立つ関数のあなた自身のライブラリを保有していて、暗黙のうちに暗黙のうちに一度そこに追加するのは簡単です。

3

他の人が言ったように、はい、完了したらSourceを終了する必要があります。もう一つの良い解決策は、ファイルを自動的に閉じるためにscala-armを使うことです。

import resource._ 

val file = "myfile.csv" 
for { 
    source <- managed(Source.fromFile(file)) 
    line <- source.getLines() 
} { 
} 
new File(file).delete 
関連する問題