Уникальные имена файлов от Unix до Windows - PullRequest
0 голосов
/ 29 августа 2018

Мне нужно периодически перемещать некоторые файлы по ftp из системы Unix в систему Windows: «123_abc.pdf», «123_Abc.pdf», «345_cde.pdf».

Мне нужно использовать эти имена файлов в приложении Windows на C #, сохраняя различия в регистре.

Я предпочитаю не использовать файл метаданных, поэтому мое решение заключается в добавлении в строку уникального числа, представляющего вторую часть (после удаления):

  • 123_abc.pdf -> 123_ABC_999999999.pdf (например, 999999999)

  • 123_Abc.pdf -> 123_ABC_000000000.pdf

  • 345_cde.pdf -> 345_CDE_123456789.pdf

затем переместите их по ftp и попробуйте восстановить оригинальное имя, чтобы сохранить его (имя) в базе данных.

Как мне сгенерировать это число? Функция должна быть обратимой (поэтому нет GetHashCode()), поэтому во второй момент я могу:

  1. Сравните f-1(999999999) == ABC;
  2. Восстановить исходную строку, добавив первую часть строки к результату f-1: "123_" + "abc" + ".pdf";

Моя первая идея:

MD5 md5Hasher = MD5.Create();
var hashed = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes("ABC"));
var ivalue = BitConverter.ToInt32(hashed, 0);

РЕДАКТИРОВАТЬ: я не буду использовать чувствительные к регистру папки в Windows.

Спасибо

1 Ответ

0 голосов
/ 29 августа 2018

Как поясняется в комментариях, один из способов убедиться, что имена файлов, которые отличаются только регистром, правильно перемещены в Windows, состоит в том, чтобы представить каждый символ в имени файла в виде шестнадцатеричного значения:

// Since .NET uses unicode chars, the hex representation
// for each char will have 4 digits
// The below has no error handling, you should add that

public static string CharToHex(char c)
{
    string lookup = "0123456789abcdef";
    int n = (int)c;
    char[] hex = new [] {
        lookup[(n >> 24) & 0xf],
        lookup[(n >> 16) & 0xf],
        lookup[(n >> 8) & 0xf],
        lookup[n & 0xf]
    };
    return new string(hex);
}

Обратное немного сложнее, но не должно быть слишком сложным для понимания.

Если кто-нибудь знает какие-либо встроенные методы в .NET Framework, пожалуйста, не стесняйтесь поделиться.

...