0

WindowsコンピューターからUnixサーバーにファイルをアップロードしているTclスクリプトの1つで問題が発生しました。Windowsファイルから元のファイル名だけを取得して、同じ名前で新しいファイルを保存したいと思います。問題は、[file tail windows_file_name]が機能せず、「dog.jpg」だけでなく「c:\ temp\dog.jpg」のようなファイル名全体が返されることです。ファイルテールは、Unixファイル名「/usr/tmp/dog.jpg」で正しく機能するため、何らかの理由で、ファイルがWindows形式であることを検出していません。ただし、私のWindowsコンピューターのTclは、どちらの名前形式でも正しく機能します。私はTcl8.4.18を使用しているので、多分それは古すぎますか?正しく分割するための別のトリックはありますか?

ありがとう

4

2 に答える 2

1

ここでの問題は、Windowsでは、両方とも\有効/なパスセパレータであるため、Windows APIが関係している限り\です(Windowsでは「公式」と見なされるだけですが)。一方、POSIXでは、有効なパス区切り文字は/。のみであり、パス名コンポーネントに表示できない2バイトは/\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です。

解決策は、Glenn Jackmanが提案したことを実行するか、他の手段(JSが適切なファイルエントリにバインドされているかどうか)を介してブラウザから短い名前を渡すことです。また、User-AgentヘッダーからユーザーのOSを検出することもできます。

グレンのアイデアをユーザーのプラットフォームにとらわれないようにするには、次のようにします。

  1. ファイル名をスキャンして「/」を探します。
    • 何も見つからない場合はset fname [string map {\\ /} $fname]、次の手順に進みます。
  2. [file tail $fn]テール名を抽出するために使用します。

それはあまり防弾ではありませんが、おそらく何もないよりはましです。

于 2012-05-04T20:25:57.503 に答える
0

あなたはいつでもすることができます[lindex [split $windows_file_name \\] end]

于 2012-05-04T20:07:03.603 に答える