tSeiya's blog

行動結果のアウトプット場

Javaとシェルスクリプトで課題チェック用プログラム(コンパイルが通っているかどうか)

Javaで対象ソース群をコンパイルして成功しているかどうかをまとめてcsvファイルに書き出す

コンパイルのために以下のシェルスクリプトを使用

#!/bin/sh
hgcc $1

if [ -e ./a.out ]; then
    echo "コンパイル成功"
    rm ./a.out
else
    echo "コンパイル失敗"
fi

※hgccはHandy Graphicsをコンパイルするのに使用
シェルスクリプトを使っているのは,Runtimeクラスで,exec("gcc XXX.c")の結果を取得できなかったから(´・ワ・`;)

directory1/directory2/targetFile(対象のソース)に対し,コンパイルを行い,「a.out」があるかどうかで,コンパイルの成功か失敗を判定している(´・ワ・`;)
結果は,result/result.csvに書き込むように設定.

/*
	課題チェック用プログラム
	実行方法: java CheckWork directory1
*/

import java.io.*;

public class CheckWork {

	public static void main(String[] args) throws IOException {
		CheckWork cw = new CheckWork();
		String output = ""; //書き込む情報
		output = "targetPath,result\n"; //header
		cw.exec("mkdir ", "result"); //resultという名のディレクトリを作成

		//引数でファイルを読み込み
		File[] files = getFile(args[0]);
		for(int i =0; i<files.length; i++)
		{
			String filePath = files[i].getPath();
			//.DS_Storeが含まれていたら省く
			if(filePath.indexOf(".DS_Store")!=-1) continue;

			File[] target = getFile(filePath);
			for(int j =0; j<target.length; j++)
			{
				String targetPath = target[j].getPath();
				//.DS_Storeが含まれていたら省く
				if(targetPath.indexOf(".DS_Store")!=-1) continue;

				System.out.println("target : "+ targetPath);
				String result = cw.exec("./compile ", targetPath);
				System.out.println("result : "+ result+"\n");
				output += targetPath+","+result+"\n";
			}
		}
		write(output, "result.csv");
	}

	public static File[] getFile(String directory)
	{
		File dir = new File(directory);
		File[] files = dir.listFiles();

		/*System.out.println("***読み込み***");
		for(int i = 0; i < files.length; i++)
		{
			System.out.println((i) + ": " + files[i]);
		}
		System.out.println("************\n");*/
		return files;
	}

	public String exec(String cmd, String targetPath) throws IOException {
		Runtime rt = Runtime.getRuntime();
		String execCmd = cmd+targetPath; //実行するコマンド
		String output = "";
		System.out.println(execCmd);

		Process p = rt.exec(execCmd);//コマンドの実行

		//実行結果のストリームを拾得
		InputStream is = p.getInputStream();
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);

		//実行結果を出力
		String line = "";
		while ((line = br.readLine()) != null) {
			output = line;
		}
		br.close();
		isr.close();
		is.close();

		p.destroy();
		return output;
	}

	public static void write(String output, String file)
	{
		File outFile = new File("result/"+file);
		try{
			FileOutputStream fos = new FileOutputStream(outFile, true);
			OutputStreamWriter osw = new OutputStreamWriter(fos , "Shift-JIS");
			BufferedWriter bw = new BufferedWriter(osw);
			bw.write(output);
			bw.newLine();
			bw.close();
			osw.close();
			fos.close();
		} catch(FileNotFoundException e) { e.printStackTrace(); }
		catch(IOException e) { e.printStackTrace(); }
	}
}

※自分用:ファイル名に全角・半角の空白等があると,コンパイルが上手くいかないので,Sunskysoft - Shupapan|Shupapanってソフトでリネームすると便利.