从文件属性中检索标签列表

时间:2018-08-21 11:45:33

标签: java windows

我想以编程方式检索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");

    }
}

An image of the Windows 7 Properties View

3 个答案:

答案 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

我没有尝试过,但是可能可以工作: Files.getAttribute(Paths.get("/some/dir","file.txt"), "description:tags")