in txtfilewriter/src/main/java/com/alibaba/datax/plugin/writer/txtfilewriter/TxtFileWriter.java [95:199]
public void prepare() {
String path = this.writerSliceConfig.getString(Key.PATH);
String fileName = this.writerSliceConfig
.getString(com.alibaba.datax.plugin.unstructuredstorage.writer.Key.FILE_NAME);
String writeMode = this.writerSliceConfig
.getString(com.alibaba.datax.plugin.unstructuredstorage.writer.Key.WRITE_MODE);
// truncate option handler
if ("truncate".equals(writeMode)) {
LOG.info(String.format(
"由于您配置了writeMode truncate, 开始清理 [%s] 下面以 [%s] 开头的内容",
path, fileName));
File dir = new File(path);
// warn:需要判断文件是否存在,不存在时,不能删除
try {
if (dir.exists()) {
// warn:不要使用FileUtils.deleteQuietly(dir);
FilenameFilter filter = new PrefixFileFilter(fileName);
File[] filesWithFileNamePrefix = dir.listFiles(filter);
for (File eachFile : filesWithFileNamePrefix) {
LOG.info(String.format("delete file [%s].",
eachFile.getName()));
FileUtils.forceDelete(eachFile);
}
// FileUtils.cleanDirectory(dir);
}
} catch (NullPointerException npe) {
throw DataXException
.asDataXException(
TxtFileWriterErrorCode.Write_FILE_ERROR,
String.format("您配置的目录清空时出现空指针异常 : [%s]",
path), npe);
} catch (IllegalArgumentException iae) {
throw DataXException.asDataXException(
TxtFileWriterErrorCode.SECURITY_NOT_ENOUGH,
String.format("您配置的目录参数异常 : [%s]", path));
} catch (SecurityException se) {
throw DataXException.asDataXException(
TxtFileWriterErrorCode.SECURITY_NOT_ENOUGH,
String.format("您没有权限查看目录 : [%s]", path));
} catch (IOException e) {
throw DataXException.asDataXException(
TxtFileWriterErrorCode.Write_FILE_ERROR,
String.format("无法清空目录 : [%s]", path), e);
}
} else if ("append".equals(writeMode)) {
LOG.info(String
.format("由于您配置了writeMode append, 写入前不做清理工作, [%s] 目录下写入相应文件名前缀 [%s] 的文件",
path, fileName));
} else if ("nonConflict".equals(writeMode)) {
LOG.info(String.format(
"由于您配置了writeMode nonConflict, 开始检查 [%s] 下面的内容", path));
// warn: check two times about exists, mkdirs
File dir = new File(path);
try {
if (dir.exists()) {
if (dir.isFile()) {
throw DataXException
.asDataXException(
TxtFileWriterErrorCode.ILLEGAL_VALUE,
String.format(
"您配置的path: [%s] 不是一个合法的目录, 请您注意文件重名, 不合法目录名等情况.",
path));
}
// fileName is not null
FilenameFilter filter = new PrefixFileFilter(fileName);
File[] filesWithFileNamePrefix = dir.listFiles(filter);
if (filesWithFileNamePrefix.length > 0) {
List<String> allFiles = new ArrayList<String>();
for (File eachFile : filesWithFileNamePrefix) {
allFiles.add(eachFile.getName());
}
LOG.error(String.format("冲突文件列表为: [%s]",
StringUtils.join(allFiles, ",")));
throw DataXException
.asDataXException(
TxtFileWriterErrorCode.ILLEGAL_VALUE,
String.format(
"您配置的path: [%s] 目录不为空, 下面存在其他文件或文件夹.",
path));
}
} else {
boolean createdOk = dir.mkdirs();
if (!createdOk) {
throw DataXException
.asDataXException(
TxtFileWriterErrorCode.CONFIG_INVALID_EXCEPTION,
String.format(
"您指定的文件路径 : [%s] 创建失败.",
path));
}
}
} catch (SecurityException se) {
throw DataXException.asDataXException(
TxtFileWriterErrorCode.SECURITY_NOT_ENOUGH,
String.format("您没有权限查看目录 : [%s]", path));
}
} else {
throw DataXException
.asDataXException(
TxtFileWriterErrorCode.ILLEGAL_VALUE,
String.format(
"仅支持 truncate, append, nonConflict 三种模式, 不支持您配置的 writeMode 模式 : [%s]",
writeMode));
}
}