Тип файла - получить оригинальное расширение - PullRequest
5 голосов
/ 05 января 2011

Как найти расширение файла, если файл был переименован?Есть ли какой-нибудь инструмент для этого?

Пример: у меня есть файл "1.doc";Я надеюсь, что все знают, что это документ Word, который я только что переименовал в «1.txt».Но файл изначально является документом Word;как я могу получить оригинальное расширение файла?

Ответы [ 3 ]

4 голосов
/ 05 января 2011

Конечно, Вы можете:)

Это код C # для вас. Я полагаю, вы можете создать свой собственный инструмент;)

using System.Runtime.InteropServices;
using System.IO;
using Microsoft.Win32;

    [DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
    private extern static System.UInt32 FindMimeFromData(
        System.UInt32 pBC,
        [MarshalAs(UnmanagedType.LPStr)] System.String pwzUrl,
        [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,
        System.UInt32 cbSize,
        [MarshalAs(UnmanagedType.LPStr)] System.String pwzMimeProposed,
        System.UInt32 dwMimeFlags,
        out System.UInt32 ppwzMimeOut,
        System.UInt32 dwReserverd
    );


    public static string getMimeFromFile(string filename)
    {
        if (!File.Exists(filename))
            throw new FileNotFoundException(filename + " not found");

        byte[] buffer = new byte[256];
        using (FileStream fs = new FileStream(filename, FileMode.Open))
        {
            if (fs.Length >= 256)
                fs.Read(buffer, 0, 256);
            else
                fs.Read(buffer, 0, (int)fs.Length);
        }
        try
        {
            System.UInt32 mimetype;
            FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0);
            System.IntPtr mimeTypePtr = new IntPtr(mimetype);
            string mime = Marshal.PtrToStringUni(mimeTypePtr);
            Marshal.FreeCoTaskMem(mimeTypePtr);
            return mime;
        }
        catch (Exception e)
        {
            return "unknown/unknown";
        }
    }

Вы получаете mimetype, используя этот код. Чтобы найти расширение от mime-type, просто выполните небольшой поиск в Google.

3 голосов
/ 05 января 2011

Невозможно.Если вы используете систему * nix, используйте команду file , чтобы определить формат файла.

Если вы действительно параноидально относитесь к тому, что происходит (и портите рабочий процесс), вы можете сделать 2 вещи:

  1. сделать хэш вашего файла, например, MD5 хеш, чтобы вы знали, что ваш файл не был скомбинирован с
  2. , запишите метку времени вашего файла, чтобы вы могли видеть, когда в последний раз он изменял
  3. takeобратите внимание на расширение вашего файла на этой отметке времени

Это защитит вас несколькими способами:

Хеш будет гарантировать, что ваш файл не был изменен.

Временная метка покажет вам, когда она была изменена в последний раз.

Расширение сообщит вам свое оригинальное расширение.

Поскольку переименование расширения файла не изменит его временную отметку, вам нужно выполнить шаг 3.

Использование подобных методов покажет вам в 99,99999999999% случаев, что ваш файл был изменен кем-то или кем-то другим.

1 голос
/ 05 января 2011

Вы не можете. Вам нужно использовать инструмент типа file, чтобы попытаться определить формат файла.

...