我想以编程方式检索Windows 7中附加到文件的标签列表。我正在尝试创建文件->标签的映射,以便可以在不同平台上移动。
有人知道一个库,还是一种从命令行获取“标签”值的方法?到目前为止,我只能找到获取基本文件属性(例如作者,创建日期等)的方法。
不幸的是,我无法在计算机上加载PowerShell脚本,因此无法使用这些功能。
我尝试使用'UserDefinedFileAttributeView',但是没有返回任何值,就像这样:
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
class TestClass {
public static void main(String args[] ) throws Exception {
//Scanner
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
Map<Integer,Integer> map = new HashMap<>();
for(int i=0;i<n;i++){
int x=sc.nextInt();
Integer value = map.get(x);
if(x < k){
if(value == null) {
map.put(x, 1);
}
else if(value<=1) map.put(x,2);
}
}
;
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
Integer key = entry.getKey();
if(k>=key && map.containsKey(k-key)) {
//check if same key
if(k - key == key){
if(map.get(key)>1) {
System.out.println("YES");
return;
}
}
else {
System.out.println("YES");
return;
}
}
}
System.out.println("NO");
}
}
答案 0 :(得分:1)
在Windows PowerShell中,您可以使用help from PresentationCore.dll
来抓取它:
function Get-ImageTags {
param(
[string]$Path
)
Add-Type -AssemblyName PresentationCore
try {
$FileStream = (Get-Item $Path).Open('Open','Read')
$BitmapFrame = [System.Windows.Media.Imaging.BitmapFrame]::Create($FileStream)
$Tags = @($BitmapFrame.Metadata.Keywords |%{ $_ })
}
catch {
throw
return
}
finally {
if($FileStream){
$FileStream.Dispose()
}
}
return $Tags
}
然后使用:
$Tags = Get-ImageTags -Path path\to\file.jpeg
$Tags
变量现在将包含标签数组
答案 1 :(得分:1)
在Github上有一个Java库,名为PE/COFF 4J
。
import java.io.IOException;
import org.boris.pecoff4j.PE;
import org.boris.pecoff4j.ResourceDirectory;
import org.boris.pecoff4j.ResourceEntry;
import org.boris.pecoff4j.constant.ResourceType;
import org.boris.pecoff4j.io.PEParser;
import org.boris.pecoff4j.io.ResourceParser;
import org.boris.pecoff4j.resources.StringFileInfo;
import org.boris.pecoff4j.resources.StringTable;
import org.boris.pecoff4j.resources.VersionInfo;
import org.boris.pecoff4j.util.ResourceHelper;
public class Main {
public static void main(String[] args) throws IOException {
PE pe = PEParser.parse("C:/windows/system32/notepad.exe");
ResourceDirectory rd = pe.getImageData().getResourceTable();
ResourceEntry[] entries = ResourceHelper.findResources(rd, ResourceType.VERSION_INFO);
for (int i = 0; i < entries.length; i++) {
byte[] data = entries[i].getData();
VersionInfo version = ResourceParser.readVersionInfo(data);
StringFileInfo strings = version.getStringFileInfo();
StringTable table = strings.getTable(0);
for (int j = 0; j < table.getCount(); j++) {
String key = table.getString(j).getKey();
String value = table.getString(j).getValue();
System.out.println(key + " = " + value);
}
}
}
}
将打印:
CompanyName = Microsoft Corporation
FileDescription = Notepad
FileVersion = 6.1.7600.16385 (win7_rtm.090713-1255)
InternalName = Notepad
LegalCopyright = © Microsoft Corporation. All rights reserved.
OriginalFilename = NOTEPAD.EXE
ProductName = Microsoft® Windows® Operating System
ProductVersion = 6.1.7600.16385
如果您提到要获取图像或视频的标签,@Drew Noakes为其编写了名为metadata-extractor的Java库。
Metadata metadata = ImageMetadataReader.readMetadata(imagePath);
要迭代文件中的所有值:
for (Directory directory : metadata.getDirectories()) { for (Tag tag : directory.getTags()) { System.out.println(tag); } }
您还可以从特定目录中读取特定值:
// obtain the Exif SubIFD directory ExifSubIFDDirectory directory = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class); // query the datetime tag's value Date date = directory.getDate(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL);
该库也可供Maven用户使用。
答案 2 :(得分:0)
我没有尝试过,但是可能可以工作:
Files.getAttribute(Paths.get("/some/dir","file.txt"), "description:tags")