Tcl определяет имя файла из загрузки браузера

88
10

Я столкнулся с проблемой в одном из моих сценариев Tcl, где я загружаю файл с компьютера Windows на Unix-сервер. Я хотел бы получить только оригинальное имя файла из файла Windows и сохранить новый файл с тем же именем. Проблема в том, что [файл tail windows_file_name] не работает, он возвращает целое имя файла, например "c:\temp\dog.jpg", а не просто "dog.jpg". Файловый хвост работает правильно над именем файла Unix "/usr/tmp/dog.jpg", поэтому по какой-то причине он не обнаруживает, что файл находится в формате Windows. Однако Tcl на моем компьютере Windows работает правильно для любого формата имени. Я использую Tcl 8.4.18, так, может быть, он слишком стар? Есть ли еще один трюк, чтобы заставить его правильно разбить?

благодаря

спросил(а) 2012-05-04T22:34:00+04:00 8 лет, 3 месяца назад
1
Решение
55

Проблема здесь в том, что в Windows оба \ и / являются допустимыми разделителями путей, так долго Windows API (хотя только \ считается "официальным" в Windows). С другой стороны, в POSIX единственным допустимым разделителем пути является /, и только два байта, которые не могут отображаться в компоненте pathname, равны / и \0 (байт со значением 0).

Следовательно, в системе POSIX "C:\foo\bar.baz" является вполне допустимым коротким именем файла и работает

file normalize {C:\foo\bar.baz}

даст /path/to/current/dir/C:\foo\bar.baz. По той же логике [file tail $short_filename] совпадает с $short_filename.

Решение состоит в том, чтобы либо сделать то, что предложил Гленн Джекман, либо каким-то образом передать короткое имя из браузера каким-либо другим способом (некоторые JS привязаны к соответствующей записи файла?). Также вы можете попытаться обнаружить пользовательскую ОС из заголовка User-Agent.

Чтобы идея Гленна стала более агностикой для пользовательской платформы, вы можете сделать следующее:

Сканируйте имя файла для "/".
    Если ни один не найден, set fname [string map {\\/} $fname] затем перейдите к следующему шагу.
Используйте [file tail $fn] для извлечения имени хвоста.

Это не очень пуленепробиваемый, но, мол, лучше ничего.

ответил(а) 2012-05-04T23:25:00+04:00 8 лет, 3 месяца назад
40

Вы всегда можете сделать [lindex [split $windows_file_name \\] end]

ответил(а) 2012-05-04T23:07:00+04:00 8 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема