在FileUtils.writeStringToFile(fileName, text)Apache的共享I/O功能将覆盖在一个文件中以前的文本.我想将数据附加到我的文件中.有什么方法可以使用Commons I/O吗?我可以使用普通BufferedWriter的Java 来做到这一点,但我很好奇使用Commons I/O.
解决:
*可行的解决方案:@sbi
*解释实际发生的事情:@Hans
*解释为什么OpenFile没有通过"DELETE PENDING":@Benjamin
问题:
我们的软件在很大程度上是专有脚本语言的解释器引擎.该脚本语言能够创建文件,处理文件,然后删除文件.这些都是单独的操作,并且在这些操作之间没有保持打开文件句柄.(即在文件创建过程中创建一个句柄,用于写入,然后关闭.在文件处理部分,一个单独的文件句柄打开文件,从中读取,并在EOF关闭.最后,删除使用:: DeleteFile它只使用文件名,而不是文件句柄.
最近我们开始意识到特定的宏(脚本)有时无法在随后的某个随机时间创建文件(即它在"创建,处理,删除"的前100次迭代中成功,但是当它到来时回到创建它一百零一次,Windows回复"拒绝访问").
深入研究这个问题,我编写了一个非常简单的程序,它循环遍历这样的事情:
while (true) {
HANDLE hFile = CreateFileA(pszFilename, FILE_ALL_ACCESS, FILE_SHARE_READ,
NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
return OpenFailed;
const DWORD dwWrite = strlen(pszFilename);
DWORD dwWritten;
if (!WriteFile(hFile, pszFilename, dwWrite, &dwWritten, NULL) || dwWritten != dwWrite)
return WriteFailed;
if (!CloseHandle(hFile))
return CloseFailed;
if (!DeleteFileA(pszFilename))
return DeleteFailed;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这直接针对Win32 API,非常简单.我创建一个文件,写入它,关闭句柄,删除它,冲洗,重复...
但是在某些地方,我会在CreateFile()调用期间收到Access Denied(5)错误.看看sysinternal的ProcessMonitor,我可以看到底层的问题是当我试图再次创建它时,文件上有一个挂起的删除.
问题:
*有没有办法等待删除完成?
*有没有办法检测文件是否正在等待删除?
我们通过HFILE上的WaitForSingleObject()尝试了第一个选项.但是,在WaitForSingleObject执行之前,HFILE始终处于关闭状态,因此WaitForSingleObject始终返回WAIT_FAILED.显然,试图等待关闭的句柄不起作用.
我可以等待文件存在的文件夹的更改通知.但是,这似乎是一个非常开销密集的kludge只是偶尔会出现问题(也就是说:在我的Win7 x64 E6600 PC的测试中,它通常会失败迭代12000+ - 在其他机器上,它可以在迭代7或15或56或永远不会发生.
我无法识别任何明确允许此以太的CreateFile()参数.无论CreateFile有什么参数,当文件待删除时打开文件进行任何访问都是不行的.由于我可以在XP盒子和x64 Win7盒子上看到这种行为,我很确定这是微软的"按照预期"的核心NTFS行为.所以我需要一个允许操作系统在我尝试继续之前完成删除的解决方案,最好是不必要地占用CPU周期,并且没有观察该文件所在文件夹的极端开销(如果可能的话).
感谢您抽出宝贵时间阅读并发布回复.澄清问题欢迎!
[1]是的,这个循环返回写入失败或无法关闭哪个泄漏,但由于这是一个简单的控制台测试应用程序,应用程序本身退出,Windows保证所有句柄在操作系统关闭时完成.所以这里没有泄漏.
bool DeleteFileNowA(const char …Run Code Online (Sandbox Code Playgroud) 我想在finally块中关闭我的流,但它会抛出一个IOException所以我似乎必须try在finally块中嵌套另一个块才能关闭流.这是正确的方法吗?看起来有点笨重.
这是代码:
public void read() {
try {
r = new BufferedReader(new InputStreamReader(address.openStream()));
String inLine;
while ((inLine = r.readLine()) != null) {
System.out.println(inLine);
}
} catch (IOException readException) {
readException.printStackTrace();
} finally {
try {
if (r!=null) r.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我试图将我的联系人保存在我的表中但是filechosser总是设置为所有文件.有没有办法我可以设置它只接受.txt并使其成为默认或唯一选项.
savecontact.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser filesave = new JFileChooser();
int returnVal = filesave.showSaveDialog(Main.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
try {
File file = filesave.getSelectedFile();
PrintWriter os = new PrintWriter(file);
os.println("");
for (int col = 0; col < table.getColumnCount(); col++) {
os.print(table.getColumnName(col) + "\t");
}
os.println("");
os.println("");
for (int row = 0; row < table.getRowCount(); row++) {
for (int col = 0; col < table.getColumnCount(); col++) {
os.print(table.getColumnName(col));
os.print(": ");
os.println(table.getValueAt(row, col));
}
os.println("");
}
os.close(); …Run Code Online (Sandbox Code Playgroud) 假设我有一个File f代表一个目录,那么f.delete()只有当它是空的时才会删除它.我在网上找到了几个使用或获取目录中所有文件的示例,然后递归遍历目录结构并删除所有文件.但是,由于可以创建无限递归的目录结构(在Windows和Linux中(带有符号链接)),可能用这种风格编写的程序可能永远不会终止.File.listFiles()File.list()
那么,有没有更好的方法来编写这样的程序,以便它不会陷入这些陷阱?我是否需要跟踪我所经过的所有地方,并确保我不会绕圈或是否有更好的方式?
更新:回答一些答案(谢谢大家!) - 我宁愿代码没有遵循符号链接并保留在它应该删除的目录中.即使在Windows情况下,我可以依赖Commons-IO实现吗?
我正在使用WinXP.我用java生成一个文件列表.该文件最初将创建为abc.txt.temp,完成生成后,它将重命名为abc.txt.
但是,当我生成文件时,某些文件无法重命名.它是随机发生的.
反正有没有找出失败的原因?
int maxRetries = 60;
logger.debug("retry");
while (maxRetries-- > 0)
{
if (isSuccess = file.renameTo(file2))
{
break;
}
try
{
logger.debug("retry " + maxRetries);
Thread.sleep(1000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//file.renameTo(file2);
Thread.currentThread().getThreadGroup().getParent().list();
Run Code Online (Sandbox Code Playgroud)
结果如下:
[DEBUG][2009-08-25 08:57:52,386] - retry 1
[DEBUG][2009-08-25 08:57:53,386] - retry 0
java.lang.ThreadGroup[name=system,maxpri=10]
Thread[Reference Handler,10,system]
Thread[Finalizer,8,system]
Thread[Signal Dispatcher,9,system]
Thread[Attach Listener,5,system]
java.lang.ThreadGroup[name=main,maxpri=10]
Thread[main,5,main]
Thread[log4j mail appender,5,main]
[DEBUG][2009-08-25 08:57:54,386] - isSuccess:false
Run Code Online (Sandbox Code Playgroud)
我想知道一种系统的方法来找出原因.谢谢.
我想将文本文件的内容读入C中的char数组中.必须保留新行.
我该如何做到这一点?我在网上找到了一些C++解决方案,但没有C解决方案.
编辑:我现在有以下代码:
void *loadfile(char *file, int *size)
{
FILE *fp;
long lSize;
char *buffer;
fp = fopen ( file , "rb" );
if( !fp ) perror(file),exit(1);
fseek( fp , 0L , SEEK_END);
lSize = ftell( fp );
rewind( fp );
/* allocate memory for entire content */
buffer = calloc( 1, lSize+1 );
if( !buffer ) fclose(fp),fputs("memory alloc fails",stderr),exit(1);
/* copy the file into the buffer */
if( 1!=fread( buffer , lSize, 1 , fp) )
fclose(fp),free(buffer),fputs("entire read fails",stderr),exit(1); …Run Code Online (Sandbox Code Playgroud) 我需要一次读取最多N行读取一个大文件,直到EOF.在Python中最有效的方法是什么?就像是:
with open(filename, 'r') as infile:
while not EOF:
lines = [get next N lines]
process(lines)
Run Code Online (Sandbox Code Playgroud) 我试图将文件传递给File(String path)类.有没有办法在assets文件夹中找到文件的绝对路径并将其传递给File().我试过file:///android_asset/myfoldername/myfilename作为路径字符串,但它没有工作.任何的想法?