src/Pure/General/file.scala
author wenzelm
Sun, 24 Mar 2013 16:19:54 +0100
changeset 51505 9e91959a8cfc
parent 51504 18095684c5a6
child 51982 fb4352e89022
permissions -rw-r--r--
prefer preset = 3 -- much faster and less memory requirement;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/file.scala
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
     3
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
     4
File system operations.
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
     5
*/
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
     6
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
     7
package isabelle
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
     8
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
     9
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    10
import java.io.{BufferedWriter, OutputStreamWriter, FileOutputStream, BufferedOutputStream,
51504
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
    11
  OutputStream, InputStream, FileInputStream, BufferedInputStream, BufferedReader,
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
    12
  InputStreamReader, File => JFile, IOException}
50684
12b7e0b4a66e support File.read_gzip as well, in accordance to File.write_gzip;
wenzelm
parents: 50203
diff changeset
    13
import java.util.zip.{GZIPInputStream, GZIPOutputStream}
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    14
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    15
import scala.collection.mutable
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    16
51504
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
    17
import org.tukaani.xz.{LZMA2Options, XZInputStream, XZOutputStream}
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
    18
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    19
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    20
object File
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    21
{
48613
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    22
  /* directory content */
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    23
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    24
  def read_dir(dir: Path): List[String] =
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    25
  {
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    26
    if (!dir.is_dir) error("Bad directory: " + dir.toString)
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    27
    val files = dir.file.listFiles
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    28
    if (files == null) Nil
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    29
    else files.toList.map(_.getName)
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    30
  }
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    31
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    32
  def find_files(dir: Path): Stream[Path] =
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    33
    read_dir(dir).toStream.map(name => {
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    34
      val path = dir + Path.basic(name)
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    35
      path #:: (if (path.is_dir) find_files(path) else Stream.empty)
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    36
    }).flatten
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    37
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
    38
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    39
  /* read */
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    40
48913
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    41
  def read_bytes(file: JFile): Array[Byte] =
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    42
  {
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    43
    var i = 0
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    44
    var m = 0
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    45
    val n = file.length.toInt
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    46
    val buf = new Array[Byte](n)
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    47
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    48
    val stream = new FileInputStream(file)
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    49
    try {
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    50
      do {
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    51
        m = stream.read(buf, i, n - i)
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    52
        if (m != -1) i += m
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    53
      } while (m != -1 && n > i)
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    54
    }
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    55
    finally { stream.close }
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    56
    buf
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    57
  }
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    58
50203
00d8ad713e32 explicit module UTF8;
wenzelm
parents: 49673
diff changeset
    59
  def read(file: JFile): String = new String(read_bytes(file), UTF8.charset)
48913
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    60
  def read(path: Path): String = read(path.file)
f686cb016c0c more direct File.read_bytes -- avoid cumulative copying of StringBuilder;
wenzelm
parents: 48613
diff changeset
    61
50684
12b7e0b4a66e support File.read_gzip as well, in accordance to File.write_gzip;
wenzelm
parents: 50203
diff changeset
    62
12b7e0b4a66e support File.read_gzip as well, in accordance to File.write_gzip;
wenzelm
parents: 50203
diff changeset
    63
  def read_stream(reader: BufferedReader): String =
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    64
  {
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    65
    val output = new StringBuilder(100)
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    66
    var c = -1
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    67
    while ({ c = reader.read; c != -1 }) output += c.toChar
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    68
    reader.close
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    69
    output.toString
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    70
  }
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    71
50684
12b7e0b4a66e support File.read_gzip as well, in accordance to File.write_gzip;
wenzelm
parents: 50203
diff changeset
    72
  def read_stream(stream: InputStream): String =
12b7e0b4a66e support File.read_gzip as well, in accordance to File.write_gzip;
wenzelm
parents: 50203
diff changeset
    73
   read_stream(new BufferedReader(new InputStreamReader(stream, UTF8.charset)))
12b7e0b4a66e support File.read_gzip as well, in accordance to File.write_gzip;
wenzelm
parents: 50203
diff changeset
    74
12b7e0b4a66e support File.read_gzip as well, in accordance to File.write_gzip;
wenzelm
parents: 50203
diff changeset
    75
  def read_gzip(file: JFile): String =
12b7e0b4a66e support File.read_gzip as well, in accordance to File.write_gzip;
wenzelm
parents: 50203
diff changeset
    76
    read_stream(new GZIPInputStream(new BufferedInputStream(new FileInputStream(file))))
51504
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
    77
50684
12b7e0b4a66e support File.read_gzip as well, in accordance to File.write_gzip;
wenzelm
parents: 50203
diff changeset
    78
  def read_gzip(path: Path): String = read_gzip(path.file)
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    79
51504
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
    80
  def read_xz(file: JFile): String =
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
    81
    read_stream(new XZInputStream(new BufferedInputStream(new FileInputStream(file))))
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
    82
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
    83
  def read_xz(path: Path): String = read_xz(path.file)
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
    84
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
    85
50845
477ca927676f immediate theory progress for build_dialog;
wenzelm
parents: 50684
diff changeset
    86
  /* read lines */
477ca927676f immediate theory progress for build_dialog;
wenzelm
parents: 50684
diff changeset
    87
477ca927676f immediate theory progress for build_dialog;
wenzelm
parents: 50684
diff changeset
    88
  def read_lines(reader: BufferedReader, progress: String => Unit): List[String] =
477ca927676f immediate theory progress for build_dialog;
wenzelm
parents: 50684
diff changeset
    89
  {
477ca927676f immediate theory progress for build_dialog;
wenzelm
parents: 50684
diff changeset
    90
    val result = new mutable.ListBuffer[String]
477ca927676f immediate theory progress for build_dialog;
wenzelm
parents: 50684
diff changeset
    91
    var line: String = null
51251
d55cce4d72dd more permissive File.read_lines, which is relevant for Managed_Process join/kill;
wenzelm
parents: 50845
diff changeset
    92
    while ({ line = try { reader.readLine} catch { case _: IOException => null }; line != null }) {
50845
477ca927676f immediate theory progress for build_dialog;
wenzelm
parents: 50684
diff changeset
    93
      progress(line)
477ca927676f immediate theory progress for build_dialog;
wenzelm
parents: 50684
diff changeset
    94
      result += line
477ca927676f immediate theory progress for build_dialog;
wenzelm
parents: 50684
diff changeset
    95
    }
477ca927676f immediate theory progress for build_dialog;
wenzelm
parents: 50684
diff changeset
    96
    reader.close
477ca927676f immediate theory progress for build_dialog;
wenzelm
parents: 50684
diff changeset
    97
    result.toList
477ca927676f immediate theory progress for build_dialog;
wenzelm
parents: 50684
diff changeset
    98
  }
477ca927676f immediate theory progress for build_dialog;
wenzelm
parents: 50684
diff changeset
    99
477ca927676f immediate theory progress for build_dialog;
wenzelm
parents: 50684
diff changeset
   100
48550
97592027a2a8 tuned signature;
wenzelm
parents: 48494
diff changeset
   101
  /* try_read */
97592027a2a8 tuned signature;
wenzelm
parents: 48494
diff changeset
   102
97592027a2a8 tuned signature;
wenzelm
parents: 48494
diff changeset
   103
  def try_read(paths: Seq[Path]): String =
97592027a2a8 tuned signature;
wenzelm
parents: 48494
diff changeset
   104
  {
97592027a2a8 tuned signature;
wenzelm
parents: 48494
diff changeset
   105
    val buf = new StringBuilder
97592027a2a8 tuned signature;
wenzelm
parents: 48494
diff changeset
   106
    for (path <- paths if path.is_file) {
97592027a2a8 tuned signature;
wenzelm
parents: 48494
diff changeset
   107
      buf.append(read(path))
97592027a2a8 tuned signature;
wenzelm
parents: 48494
diff changeset
   108
      buf.append('\n')
97592027a2a8 tuned signature;
wenzelm
parents: 48494
diff changeset
   109
    }
97592027a2a8 tuned signature;
wenzelm
parents: 48494
diff changeset
   110
    buf.toString
97592027a2a8 tuned signature;
wenzelm
parents: 48494
diff changeset
   111
  }
97592027a2a8 tuned signature;
wenzelm
parents: 48494
diff changeset
   112
97592027a2a8 tuned signature;
wenzelm
parents: 48494
diff changeset
   113
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   114
  /* write */
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   115
51504
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   116
  private def write_file(file: JFile, text: CharSequence, make_stream: OutputStream => OutputStream)
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   117
  {
51504
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   118
    val stream = make_stream(new FileOutputStream(file))
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   119
    val writer = new BufferedWriter(new OutputStreamWriter(stream, UTF8.charset))
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   120
    try { writer.append(text) } finally { writer.close }
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   121
  }
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   122
51504
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   123
  def write(file: JFile, text: CharSequence): Unit = write_file(file, text, (s) => s)
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   124
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   125
  def write(path: Path, text: CharSequence): Unit = write(path.file, text)
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   126
51504
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   127
  def write_gzip(file: JFile, text: CharSequence): Unit =
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   128
    write_file(file, text, (s: OutputStream) => new GZIPOutputStream(new BufferedOutputStream(s)))
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   129
48494
00eb5be9e76b read/write dependency information;
wenzelm
parents: 48418
diff changeset
   130
  def write_gzip(path: Path, text: CharSequence): Unit = write_gzip(path.file, text)
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   131
51504
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   132
  def write_xz(file: JFile, text: CharSequence, preset: Int)
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   133
  {
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   134
    val options = new LZMA2Options
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   135
    options.setPreset(preset)
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   136
    write_file(file, text, (s: OutputStream) =>
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   137
      new XZOutputStream(new BufferedOutputStream(s), options))
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   138
  }
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   139
51505
9e91959a8cfc prefer preset = 3 -- much faster and less memory requirement;
wenzelm
parents: 51504
diff changeset
   140
  def write_xz(file: JFile, text: CharSequence): Unit = write_xz(file, text, 3)
51504
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   141
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   142
  def write_xz(path: Path, text: CharSequence, preset: Int): Unit =
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   143
    write_xz(path.file, text, preset)
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   144
51505
9e91959a8cfc prefer preset = 3 -- much faster and less memory requirement;
wenzelm
parents: 51504
diff changeset
   145
  def write_xz(path: Path, text: CharSequence): Unit = write_xz(path.file, text, 3)
51504
18095684c5a6 basic support for xz files;
wenzelm
parents: 51251
diff changeset
   146
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   147
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   148
  /* copy */
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   149
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   150
  def eq(file1: JFile, file2: JFile): Boolean =
49673
2a088cff1e7b more robust File.eq, and thus File.copy of "~~/lib/logo/isabelle.gif";
wenzelm
parents: 49610
diff changeset
   151
    try { java.nio.file.Files.isSameFile(file1.toPath, file2.toPath) }
2a088cff1e7b more robust File.eq, and thus File.copy of "~~/lib/logo/isabelle.gif";
wenzelm
parents: 49610
diff changeset
   152
    catch { case ERROR(_) => false }
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   153
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   154
  def copy(src: JFile, dst: JFile)
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   155
  {
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   156
    if (!eq(src, dst)) {
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   157
      val in = new FileInputStream(src)
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   158
      try {
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   159
        val out = new FileOutputStream(dst)
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   160
        try {
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   161
          val buf = new Array[Byte](65536)
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   162
          var m = 0
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   163
          do {
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   164
            m = in.read(buf, 0, buf.length)
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   165
            if (m != -1) out.write(buf, 0, m)
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   166
          } while (m != -1)
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   167
        }
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   168
        finally { out.close }
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   169
      }
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   170
      finally { in.close }
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   171
    }
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   172
  }
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   173
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   174
  def copy(path1: Path, path2: Path): Unit = copy(path1.file, path2.file)
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   175
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   176
48613
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48550
diff changeset
   177
  /* tmp files */
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   178
48418
1a634f9614fb some actual build function on ML side;
wenzelm
parents: 48411
diff changeset
   179
  def tmp_file(prefix: String): JFile =
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   180
  {
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   181
    val file = JFile.createTempFile(prefix, null)
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   182
    file.deleteOnExit
48418
1a634f9614fb some actual build function on ML side;
wenzelm
parents: 48411
diff changeset
   183
    file
1a634f9614fb some actual build function on ML side;
wenzelm
parents: 48411
diff changeset
   184
  }
1a634f9614fb some actual build function on ML side;
wenzelm
parents: 48411
diff changeset
   185
1a634f9614fb some actual build function on ML side;
wenzelm
parents: 48411
diff changeset
   186
  def with_tmp_file[A](prefix: String)(body: JFile => A): A =
1a634f9614fb some actual build function on ML side;
wenzelm
parents: 48411
diff changeset
   187
  {
1a634f9614fb some actual build function on ML side;
wenzelm
parents: 48411
diff changeset
   188
    val file = tmp_file(prefix)
48411
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   189
    try { body(file) } finally { file.delete }
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   190
  }
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   191
}
5b3440850d36 more abstract file system operations in Scala, corresponding to ML version;
wenzelm
parents:
diff changeset
   192