フォルダ内の.scalaファイルのタイプスタンプのスナップを取得する。
既存のタイムスタンプと現在のファイルのタイムスタンプを比較し更新されたファイルを取得しコンパイル可能なバッチファイルを生成する
BASEが2回出てきているが、どちらも自動的にJarファイルを読み込みたいフォルダである。下記の例のように追加したいフォルダの数だけ繰り返し記述するとよいでしょう。
@echo off setlocal ENABLEDELAYEDEXPANSION set CP=. set BASE=C:\scala\lib for %%f in (%BASE%\*) do set CP=!CP!;%%f set BASE=C:\scala\lib\user for %%f in (%BASE%\*) do set CP=!CP!;%%f SET SCALA_DOC_HOME="C:\scala\doc" ECHO %CP% scalac -classpath %CP% %1
p Dir::entries("/home/take")
[".", "..", "WorkbookScala.scala"]
p Dir::entries("/home/take")
[".", "..", "WorkbookScala.scala"]
フォルダの区切り文字は\ではなく、/を使うこと
s = File.stat("c:/scala/user/src/WorkbookScala.scala") puts File.mtime(fname).strftime("%Y/%m/%d %H:%M:%S") # 最終更新時刻
c:/scala/user/src/WorkbookScala.scala 2009/12/05 22:16:11
path=ARGV[0].gsub("\\","/") ext="scala" outfile="timestamp.txt" buffer = "" # **は再帰的検索。\0は複数パターンの区切り。.*は隠しファイル取得 Dir.glob("#{path}/**/*\0#{path}/**/.*" + ext).each{|name| puts name buffer = buffer + name + "\n" s = File.stat(name) timestamp = File.mtime(fname).strftime("%Y/%m/%d %H:%M:%S") # 最終更新時刻 puts timestamp buffer = buffer + timestamp + "\n" } # タイムスタンプスナップを上書き更新します。 file = File.open(path + "/" + outfile, "w"); # 書き込む file.write(buffer); file.close
ruby c:\scala\bin\snap_timestamp.rb "c:\scala\user\src"
更新したファイルを出力する
#第一引数はフォルダ名 path=ARGV[0].gsub("\\","/") ext=/.*\.scala$/ outfile="timestamp.txt" current={} # **は再帰的検索。\0は複数パターンの区切り。.*は隠しファイル取得 Dir.glob("#{path}/**/*\0#{path}/**/.*" ).each{|name| if ext =~ name s = File.stat(name) current.store(name,File.mtime(name).strftime("%Y/%m/%d %H:%M:%S")) end } # タイムスタンプ保存用ファイル読み込み before={} file = open(path+"/"+outfile) buffer = file.read().split("\n"); file.close #2行を1つの配列にまとめた配列を作成 newItem="" newItem = nil buffer.each{|line| if newItem == nil newItem=line else if ext =~ newItem before.store(newItem,line) end newItem = nil end } #タイムスタンプの比較 更新・新規追加したファイルを出力 current.each{|filepath, timestamp| if timestamp != before.fetch(filepath) puts filepath end }
RubyをWindowsのDOSで動作させるとRubyからバッチファイルを動作させる際に使用する システムのShellが使用している
のPathの分割処理がバグっているというかcygwinしか想定していないので、 使えません。 動かしてもwindows版rubyにはfork関数が最初から実装されていないっぽい。 つまり複数プロセスの同時実行には対応していない。
Runtime r = Runtime.getRuntime(); Process p = r.exec("java -version");
Runtime r = Runtime.getRuntime(); Process p = r.exec(new String[] { "C:\\Program Files\\Java\\j2re1.4.2_13\\bin\\java", "-version" });
Runtime r = Runtime.getRuntime(); Process p = r.exec("cmd /c echo zzz"); // Process p = r.exec(new String[]{ "cmd", "/c", "echo", "zzz" });
String[] env = new String[2]; env[0] = "TEST=サンプル"; env[1] = "PATH=" + System.getProperty("java.library.path");
Runtime r = Runtime.getRuntime(); Process p = r.exec("cmd /c echo %TEST%", env);
http://www.ne.jp/asahi/hishidama/home/tech/java/process.html#Runtime
上記で紹介した外部プロセス起動のスレッドを使ったコードはこちら
import java.io.*; import java.util.*; /** * InputStreamを読み込むスレッド */ public class InputStreamThread extends Thread { private BufferedReader br; private List<String> list = new ArrayList<String>(); /** コンストラクター */ public InputStreamThread(InputStream is) { br = new BufferedReader(new InputStreamReader(is)); } /** コンストラクター */ public InputStreamThread(InputStream is, String charset) { try { br = new BufferedReader(new InputStreamReader(is, charset)); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } @Override public void run() { for (;;) { try { String line = br.readLine(); if (line == null) break; list.add(line); } catch (IOException e) { throw new RuntimeException(e); } } } /** 文字列取得 */ public List<String> getStringList() { return list; } }
class InputStreamActor(is :InputStream , charset :String) extends Actor{ var br : BufferedReader = null; var list:ArrayList[String] = new ArrayList() if (charset == "") { br = new BufferedReader(new InputStreamReader(is)); } else { try { br = new BufferedReader(new InputStreamReader(is, charset)); } catch { case e: UnsupportedEncodingException => { throw new RuntimeException(e); } } } def this(is :InputStream) = this(is,""); def act() { var cnt = 0 val maximum = 100 while (cnt < maximum) { cnt = cnt + 1 try { var line = br.readLine(); if (line == null){ exit() } list.add(line); } catch { case e:IOException => throw new RuntimeException(e); } } } }