我目前在Java代码中遇到了FileOutputStream的问题.
实际上我使用FileOutputStream来创建文件,但是一旦创建了文件,就无法删除它.据我所知,这可能来自FileOutputstream未关闭的事实.
在我的汇总代码下面:
outFile = new FileOutputStream(dir+"\\"+fileName);
outFile.write("Test");
outFile.flush();
outFile.close();
outFile = null;
System.gc();
Run Code Online (Sandbox Code Playgroud)
然后就没有办法删除文件,即使是"手动".当我的程序启动时,我无法通过简单的del在Windows上删除它.我还试图删除文件夹目录的内容,但它也没有用,使用此代码:
static public void delDir( String place )
{
File path = new File( place );
System.out.println(path.exists());//return true
if( path.exists() )
{
File[] f = path.listFiles();
for( int j = 0 ; j < f.length ; j++ )
{
if( f[ j ].isDirectory() )
{
deleteDirectory( path+"\\"+f[ j ] );
}
f[ j ].delete();
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是: 如何关闭此文件以进行下一次删除(或者如果我们无法关闭它,如何正确删除它)?
我有一个非常简单的查询.我的桌面上有一个文件夹"x"(Windows 7),我想编写一个批处理程序来删除其中的所有文件.(所有扩展)这就是我提出的:
cd c:\users\admin\desktop\x\
del *.*
Run Code Online (Sandbox Code Playgroud)
但是,当我打开它时,控制台仍然要求人为输入(Y/N).我该怎么做才能绕过这个?
我无法在任何地方找到我的问题的答案,所以我想我已经问过了.
我正在使用Alamofire 3.1.5上传相当大量的图片,我们正在谈论数百MB.
有一个代码片段:
self.manager.upload(.POST, url, headers: headers, multipartFormData: { multipartFormData in
multipartFormData.appendBodyPart(fileURL: generalURL, name: "general", fileName: "general", mimeType: "image/jpeg")
multipartFormData.appendBodyPart(fileURL: img1URL, name: "img1", fileName: "img1", mimeType: "image/jpeg")
multipartFormData.appendBodyPart(fileURL: img2URL, name: "img2", fileName: "img2", mimeType: "image/jpeg")
multipartFormData.appendBodyPart(fileURL: img3URL, name: "img3", fileName: "img3", mimeType: "image/jpeg")
}, encodingCompletion: { encodingResult in
.
.
.
Run Code Online (Sandbox Code Playgroud)
据我所知,Alamofire通过将它们保存到磁盘来处理创建这些请求,以实现更好的RAM优化.这很聪明,我真的很高兴.它只是完美无瑕.
另一方面,这意味着它基本上使磁盘上的数据有效负载翻倍.
事情是那些文件没有被删除,它甚至导致iOS默认屏幕警告设备在可用空间上运行不足.
我知道如何删除此目录的内容,但在我当前的代码流中,在完成所有请求后删除内容是安全的,甚至可能是100个请求,并且每个请求大约需要20MB的有效负载.所以问题是设备甚至可能没有存储这么多数据的能力.
我的问题是:
成功上传后,我可以让Alamofire删除这些文件中的每一个吗?
对不起,很长的问题,我会在这里给你发一个土豆,但这不是9gag.
Winforms程序需要将一些运行时信息保存到XML文件中.该文件有时可能是几百千字节.在beta测试期间,我们发现一些用户会毫不犹豫地随机终止进程并偶尔导致文件被写入一半并因此被破坏.
因此,我们将算法更改为保存到临时文件,然后删除实际文件并执行移动.
我们的代码目前看起来像..
private void Save()
{
XmlTextWriter streamWriter = null;
try
{
streamWriter = new XmlTextWriter(xmlTempFilePath, System.Text.Encoding.UTF8);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyCollection));
xmlSerializer.Serialize(streamWriter, myCollection);
if (streamWriter != null)
streamWriter.Close();
// Delete the original file
System.IO.File.Delete(xmlFilePath);
// Do a move over the top of the original file
System.IO.File.Move(xmlTempFilePath, xmlFilePath);
}
catch (System.Exception ex)
{
throw new InvalidOperationException("Could not save the xml file.", ex);
}
finally
{
if (streamWriter != null)
streamWriter.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
这几乎在所有时间都在实验室和生产中使用.该程序在12台计算机上运行,平均每5分钟调用一次该代码.每天大约一两次我们得到这个例外:
System.InvalidOperationException:
Could not save the xml …Run Code Online (Sandbox Code Playgroud) 我用了
File f=new File(MyPath);
f.delete();
Run Code Online (Sandbox Code Playgroud)
我使用了权限WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE,但它在 Android 5 中不起作用。
Logcat 消息:
java.io.FileNotFoundException: storage/external_SD/mm.txt: open failed: EACCES (Permission denied)
Run Code Online (Sandbox Code Playgroud)
清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mahestan_programming.myapplication">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
自版本 4.4 起,我们无法从 MICRO SD 卡删除和写入文件。现在它是只读的。
android delete-file android-permissions android-external-storage
很简单,我想删除一个可能存在也可能不存在的文件。仅使用remove(filename)并忽略返回值是不好的做法吗?
编辑:通过删除,我指的是这个
我在使用 org.apache.commons.io.FileUtils 从 img 目录中删除文件时遇到问题。我正在使用此代码:
File dir = new File(".\\img");
FileFilter fileFilter = new WildcardFileFilter(userId + ".*");
File[] files = dir.listFiles(fileFilter);
System.out.println("files found: " + files.length);
for (int i = 0; i < files.length; i++) {
boolean success = FileUtils.deleteQuietly(files[i]);
System.out.println(files[i] + " delete result = " + success);
}
}
Run Code Online (Sandbox Code Playgroud)
实际上,该代码用于用新的图像文件替换 img 目录中存在的图像文件。我需要删除所有以前存在的名称为 n.* 的文件,并使用新文件 egnpng。如果我尝试删除图像文件,我会得到变量成功的假值,并且文件不会被删除。但不是图像文件,例如 *.abc;*.acd; *.acdc 等被成功删除。这个问题是什么情况?
用户上传图像后,我必须将图像存储几分钟,直到用户确认并将其存储在数据库中
所以我想创建一个临时文件并用它来显示预览。
但我必须确保,如果用户不再交互,该文件将在一段时间后被删除
我发现这篇关于临时文件以及如何自动删除它们的文章https://softwarecave.org/2014/02/05/create-temporary-files-and-directories-using-java-nio2/
但如果我理解正确的话,deleteOnExit 和 ShutdownHook 将在虚拟机关闭后调用,所以如果我的应用程序长时间保持在线,谢谢,这些文件永远不会被删除,并且当我调用 close 方法时 DELETE_ON_EXIT 选项将删除文件,所以如果我从不调用由于用户不执行任何操作,因此该文件也永远不会被删除。这是正确的?
那么..有什么方法可以保证文件在一段时间后自动删除吗?
我正在考虑使用 deleteOnExit 和 DELETE_ON_CLOSE 选项创建一个文件,并添加到具有“超时”的线程,并在超时后检查文件是否仍然存在并删除,但我不知道是否存在最佳方法。
谢谢
更新
根据最佳答案,我开发了一个项目,java.util.File在 Kotlin 中写入时添加此行为。
https://github.com/vinicius-rob-cunha/kotlin-auto-delete-file
我有100个不同名称的文件夹,每个文件夹里面应该有相同的三个文件,但在某些文件夹中,这三个文件都不存在.
如何删除那些空的或只包含一个或两个文件的文件夹?
这些是三个文件:
001.7z
002.7z
003.7z
Run Code Online (Sandbox Code Playgroud) 我创建了一个 CodePipeline,它从 CodeCommit 存储库获取输入(文件)并将文件部署到 S3 存储桶。当我删除 CodeCommit 存储库中的文件时,管道不会删除相应 S3 存储桶中的文件。简而言之,我希望我的 S3 存储桶与 CodeCommit 存储库同步。我怎样才能实现这个目标?
我的管道没有 CodeBuild 阶段。
AWS-CodeCommit --> CodePipeline --> 部署到跨账户-S3
amazon-s3 amazon-web-services delete-file aws-codecommit aws-codepipeline