- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我遇到一个问题,如果在清理期间由网络用户打开,用 Java 编写的存档模块无法清理通过 smb 共享的文件。以下是文件清理代码的简化版本:
private static boolean moveFile(String sourceFilePath, String targetFilePath) {
boolean fileStatus = false;
File sourceFile = new File(sourceFilePath );
File targetFile = new File(targetFilePath );
if(sourceFile.canRead() && sourceFile.canWrite() ) {
if(targetFile.exists()) {
fileStatus = (new File(targetFilePath)).delete();
if(!fileStatus) {
Logger.ERROR("Target deletion failed");
}
}
fileStatus = sourceFile.renameTo(new File(targetFilePath));
if(!fileStatus) {
Logger.ERROR("RenameTo method failed");
return false;
} else {
Logger.INFO("Move succeeded");
return true;
}
} else {
Logger.ERROR("Cannot read file");
return false;
}
}
当我在两个 Linux session 中测试它时,它工作正常: session A:
cat -v /dev/zero > sourceFile.txt
session B:
java -jar JavaUnixFileRemovalTest.jar sourceFile.txt targetFile.txt
但在使用网络共享和用户时在生产中失败。
我想要实现的是将文件复制到存档文件夹并取消链接 header 。这样,如果用户仍然打开文件,他将继续访问内容,同时从文件系统中删除名称,这样其他人就无法看到该文件。
所以问题是,是否有一种方法可以通过 native Java 在 Unix 中取消链接文件头,而无需显式调用 unlink
命令
最佳答案
经过一番研究后,我决定以一种有点不同的方式解决这个问题,并施展强大的远古遗迹魔法——也就是说,在 JNA (Java Native Access) 的帮助下使用 native 系统 C 调用。
下面是一个代码示例,其中包含一些针对 JNA 初学者的解释:
package com.WeLoveStackOverflow.JavaJNAUnlinkTest;
import java.io.File;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class Main {
private static CStdLib cStdLib;
// Here you specify prototypes of native C methods to be called during runtime
// Because unlink(char *path) uses pointer to const char as argument, a wrapper class StringByReference is used to convert data types
// Link to other examples at the end of this post
public interface CStdLib extends Library {
int unlink(StringByReference path);
}
public static void main(String[] args) {
// Here I'm declaring libc usage, but you can link anything. Even your own libraries
cStdLib = (CStdLib)Native.loadLibrary("c", CStdLib.class);
Logger.INFO("Source file: " + args[0]);
Logger.INFO("Target file: " + args[1]);
moveFile(args[0],args[1]);
}
private static boolean moveFile(String sourceFilePath, String targetFilePath) {
boolean fileStatus = false;
File sourceFile = new File(sourceFilePath );
File targetFile = new File(targetFilePath );
if(sourceFile.canRead() && sourceFile.canWrite() ) {
if(targetFile.exists()) {
fileStatus = targetFile.delete();
if(!fileStatus) {
Logger.ERROR("Target deletion failed");
}
}
fileStatus = sourceFile.renameTo(targetFile);
if(!fileStatus) {
Logger.ERROR("RenameTo method failed");
Logger.INFO("Trying to copy file and unlink the original");
// ToDo: add copy method
// That's where we convert String to char*
StringByReference unlinkPath=new StringByReference(sourceFilePath);
int status=cStdLib.unlink(unlinkPath);
if(status==0){
Logger.INFO("Unlink succeeded");
}else {
Logger.ERROR("Unlink also failed");
return false;
}
} else {
Logger.INFO("Move succeeded");
}
} else {
Logger.ERROR("Cannot read file");
return false;
}
return true;
}
}
以及用于转换数据类型的类:
package com.WeLoveStackOverflow.JavaJNAUnlinkTest;
import com.sun.jna.ptr.ByReference;
public class StringByReference extends ByReference {
public StringByReference() {
this(0);
}
public StringByReference(String str) {
super(str.length() < 4 ? 4 : str.length() + 1);
setValue(str);
}
private void setValue(String str) {
getPointer().setString(0, str);
}
}
那么我们最终得到了什么?一个不错的 Java 取消链接实用程序!测试场景:在 session A 中创建一个文本文件,在 session B 中用 less
打开它并在 session A 中运行 java 代码。按预期工作:
[me@server1 JavaFileTest]$ lsof | grep sourceFile
less 12611 me 4r REG 253,0 0 73 /home/me/JavaFileTest/sourceFile (deleted)
这是我用作引用的文章: http://jnaexamples.blogspot.com/2012/03/java-native-access-is-easy-way-to.html它包含其他为 C 调用包装数据类型的好例子
提示:
JNA 4.4.0 需要 GLIBC_2.14。如果你收到这个错误只需降级 JNA(4.2.2 对我有用)
线程“主”java.lang.UnsatisfiedLinkError 中的异常:/lib64/libc.so.6:找不到版本“GLIBC_2.14”
关于Java删除文件unix方式(unlink header),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43342059/
我的应用程序有一个 ' Photo ' 字段来存储 URL。它使用 sfWidgetFormInputFileEditable对于小部件架构。要在上传新图像时删除旧图像,我在覆盖的 setter 中设
在代码示例中,我有时会发现像这样的行: import android.app.Activity import android.os.Bundle 我在文档中找不到关于此的任何内容。为什么要用这个,有什
我正在使用一个名为 Jquery-Oembed-All 的插件来嵌入来自 soundcloud 的音频。我将轨道名称、年份和 URL 存储在数据库中,经过查询后,音频已嵌入我的网站。我的问题是显示的文
想删除一个产品,删除产品的图片,但又不想缺什么。产品删除正常但不删除图像 if((isset($_GET["remove"])) && ($_GET["remove"] != "")){ $i
PHP unlink() not working to delete files 我的代码在数据库中正确删除,但无法从文件中删除,请问如何帮助我删除上传文件中的数据? Query($strSQL);
我试图预测我可以使用 unlink() 删除哪些文件。 到目前为止,我的理解是该文件必须对其他人可写,或者与执行程序具有相同的组 ID 或所有者 ID。 还有其他情况吗?我正在尝试解释我的程序如何删除
我正在编写进程间通信的代码。 在接收进程代码中我调用了方法 unlink("datapipe"); 我还包含了#include 头文件。 最后我得到了以下错误: receiver.c:12: erro
for($i=0; $i (来源:http://au1.php.net/chdir) 关于php - unlink() 不起作用,我们在Stack Overflow上找到一个类似的问题: https:
我遇到一个问题,如果在清理期间由网络用户打开,用 Java 编写的存档模块无法清理通过 smb 共享的文件。以下是文件清理代码的简化版本: private static boolean mov
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我在通过 unlink() 函数删除文件时遇到问题。当文件使用西里尔文名称时,该功能不起作用。 [24-Jul-2012 00:33:35 UTC] PHP Warning: unlink(/home
好吧,我一直想知道我是否可以正确处理 unlink() 函数。我不希望 unlink() 函数在无法取消链接文件时抛出一些讨厌的错误(可能是由于找不到文件)。 我尝试了类似的东西 try {
最近在写个网站,需要上传图片,如果修改图片,就图片就没有用了,会占用服务器的硬盘资源,所以想到用unlink函数删除旧照片. 问题 : unlink函数只能删除 相对于函数执行文件的相对目录&nb
我正在尝试通过 AJAX 函数取消链接来删除图像,该函数在传递文件路径之前使用encodeURIComponent对文件路径进行编码。但是,我在取消链接时遇到错误,所以我做了一些尝试来查找错误。 当我
我想读取命令行参数中给出的文件并在读取后将其删除。这就是我正在做的事情。 char *filename = argv[1]; char *outputfile = strcat(argv[1], ".
我在使用 featherlight 时遇到了一些问题,由于某种原因它无法正常工作,我正在使用 Ghost 作为平台并且我使用 Ghost 的 Markdown 将几张图片添加到帖子中,为了使 feat
这个问题在这里已经有了答案: 关闭 13 年前。 Possible Duplicate: Deleting files by type in Python on Windows 如何删除目录中所有扩
来自 APUE #include int unlink(const char *pathname); Only when the link count reaches 0 can the conte
我试图在第一次显示后从服务器中删除图片 (.jpg)。但是文件在显示之前被删除(unlink();)。我已经尝试过使用 sleep() 但这只会延迟加载,并且在显示之前删除所有文件。 最佳答案 您可以
我是 Node.js 新手。 const fs = require('fs'); fs.unlink('/tmp/hello', (err) => { if (err) throw err;
我是一名优秀的程序员,十分优秀!