Я хотел бы получить список тегов, прикрепленных к файлу в Windows 7 программно. Я пытаюсь создать сопоставление тегов file->, которые я могу перемещать по разным платформам.

Кто-нибудь знает библиотеку или способ получить значения «Теги» из командной строки? До сих пор я только смог найти способы получить базовые атрибуты файла, такие как Автор, Дата создания и т. Д.

Я не могу загрузить сценарии PowerShell на компьютер, к сожалению, поэтому не могу использовать эти функции.

Я попытался использовать UserDefinedFileAttributeView, но это не вернуло никаких значений, например так:

   private LinkedList<String> windowsGetAllFileTags(File file) {

    UserDefinedFileAttributeView fileAttributeView = Files.getFileAttributeView(file.toPath().toAbsolutePath(), UserDefinedFileAttributeView.class);
    List<String> allAttributes = null;
    try {
        allAttributes = fileAttributeView.list();
    } catch (IOException e) {
        e.printStackTrace();
    }
    for(String attribute : allAttributes) {
        System.out.println("Attribute = " + attribute);
    }
    return null;
}

Изображение окна свойств Windows 7

0
MSix 21 Авг 2018 в 14:45

3 ответа

Лучший ответ

На 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 написал библиотеку 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.

1
snr - Reinstate Monica 21 Авг 2018 в 13:05

В Windows PowerShell вы можете получить его с небольшим справка от 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
Mathias R. Jessen 21 Авг 2018 в 12:04

Как насчет Files.getAttribute

Я не пробовал это, но, вероятно, это может сработать: Files.getAttribute(Paths.get("/some/dir","file.txt"), "description:tags")

0
bilak 21 Авг 2018 в 11:53
51947972