1 package jp.sourceforge.gokigen.memoma.fileio;
3 import android.os.Environment;
4 import android.util.Log;
6 import java.io.FileInputStream;
7 import java.io.FileOutputStream;
8 import java.io.InputStream;
9 import java.io.OutputStream;
10 import java.text.SimpleDateFormat;
11 import java.util.Calendar;
13 import jp.sourceforge.gokigen.memoma.Main;
16 * 外部ストレージにデータを記録するために使うユーティリティ
20 public class ExternalStorageFileUtility
22 private final String TAG = toString();
23 private final int COPY_BUFFER_SIZE = 32768;
24 private final int BUFFER_MARGIN = 4;
26 private String baseDirectory = "/";
32 public ExternalStorageFileUtility(String offsetDir)
34 // ベースディレクトリの作成 (あれば何もしない)
35 if (!prepareBaseDirectory(offsetDir))
37 Log.v(TAG, " prepareBaseDirectory : error");
45 private boolean prepareBaseDirectory(String offsetDir)
47 String gokigenDirectory = Environment.getExternalStorageDirectory().getPath() + "/Gokigen";
48 Log.v(TAG, "DIR : " + gokigenDirectory);
51 File baseDir = new File(gokigenDirectory);
52 if (!baseDir.exists())
54 if (!baseDir.mkdirs())
56 // ベースディレクトリ作成失敗...終了する
57 baseDirectory = Environment.getExternalStorageDirectory().getPath();
61 gokigenDirectory = gokigenDirectory + offsetDir;
62 baseDir = new File(gokigenDirectory);
63 if (!baseDir.exists())
65 if (!baseDir.mkdirs())
67 // ベースディレクトリ作成失敗...終了する
68 baseDirectory = Environment.getExternalStorageDirectory().getPath() + "/Gokigen";
72 baseDirectory = gokigenDirectory;
77 Log.v(Main.APP_IDENTIFIER, "prepareBaseDirectory() : " + ex.getMessage());
79 baseDirectory = Environment.getExternalStorageDirectory().getPath();
85 * @return 書き込みを行うアプリ用ベースディレクトリ
87 public String getGokigenDirectory()
89 return (baseDirectory);
98 public boolean makeDirectory(String dirName)
100 String makeDir = baseDirectory + "/" + dirName;
103 File dir = new File(makeDir);
104 if (dir.exists() == false)
106 return (dir.mkdirs());
112 Log.v(Main.APP_IDENTIFIER, "makeDirectory() : " + ex.getMessage());
119 * @param fileName ファイル名
120 * @param isAppend 追記モードでオープンするか?
123 public FileOutputStream openFileStream(String fileName, boolean isAppend)
127 String targetName = baseDirectory + "/" + fileName;
128 FileOutputStream fileStream = new FileOutputStream(targetName, isAppend);
133 Log.v(Main.APP_IDENTIFIER, "openFileStream() : " + e.getMessage());
139 * 日単位でディレクトリを作成し、そこに書き込むためのファイル名を決定する
142 private String decideFileNameWithSpecifiedDate(String fileName, String year, String month, String date)
144 String directory = year;
149 directory = directory + "/" + year + month;
152 makeDirectory(directory);
154 directory = directory + "/" + year + month + date;
157 makeDirectory(directory);
159 return (directory + "/" + year + month + date + "-" + fileName);
163 * 日単位でディレクトリを作成し、そこに書き込むためのファイル名を決定する
166 public String decideFileNameWithDate(String fileName)
168 Calendar calendar = Calendar.getInstance();
170 SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");
171 SimpleDateFormat monthFormat = new SimpleDateFormat("MM");
172 SimpleDateFormat dateFormat = new SimpleDateFormat("dd");
174 String year = yearFormat.format(calendar.getTime());
175 String month = monthFormat.format(calendar.getTime());
176 String date = dateFormat.format(calendar.getTime());
178 return (decideFileNameWithSpecifiedDate(fileName, year, month, date));
182 * 日単位でディレクトリを作成し、そこに書き込むためのファイル名を決定する
185 public String decideFileNameWithSpecifiedDate(String fileName, int year, int month, int day)
187 String yearStr = year + "";
188 String monthStr = "";
191 monthStr = "0" + month;
195 monthStr = month + "";
206 return (decideFileNameWithSpecifiedDate(fileName, yearStr, monthStr, dayStr));
216 public String decideDateDirectory(int year, int month, int date)
218 String addMonth = "";
220 String directory = baseDirectory + "/" + year + "/";
229 directory = directory + year + addMonth + month + "/" + year + addMonth + month + addDate + date + "/";
234 * ファイルのコピー (kaniFilerから持ってきた...)
236 * @param destFileName コピー先ファイル (full path)
237 * @param srcFileName コピー元ファイル (full path)
239 public boolean copyFile(String destFileName, String srcFileName)
245 InputStream is = null;
246 OutputStream os = null;
248 if (destFileName == srcFileName)
250 // ファイル名が同じだった場合にはコピーを実行しない
256 srcFile = new File(srcFileName);
257 if (srcFile.exists() != true)
259 // ファイルが存在しなかった、、、終了する
262 is = new FileInputStream(srcFile);
264 long dataFileSize = srcFile.length();
265 byte[] buffer = new byte[COPY_BUFFER_SIZE + BUFFER_MARGIN];
267 dstFile = new File(destFileName);
268 if (dstFile.exists() == true)
270 // ファイルが存在した、、、削除して作り直す
274 os = new FileOutputStream(dstFile);
275 if ((is != null)&&(os != null))
277 while (dataFileSize > 0)
279 int size = is.read(buffer, 0, COPY_BUFFER_SIZE);
284 os.write(buffer, 0, size);