2

ファイルの拡張子を取得したいですか?そのような:

import os
print os.path.splitext('testit.doc')
""">>>('testit', '.doc')"""

しかし、次の例を使用すると機能しません。

import os
print os.path.splitext('testid.tar.gz')
""">>>('testit.tar', '.gz')"""

場所に同じ名前のファイルがある場合、Chromeはファイルの名前を自動的に変更できるようです。(1)または(n)が追加されます。どうなるのか知りたい!誰か教えてもらえますか? ここに画像の説明を入力してください

4

2 に答える 2

3

幸いなことに、クロムはオープンソースであるため、十分に文書化されたコードを調べることができます。わかりました...私はそれを見つけました:ここに

RenameAndUniquifyは:

void DownloadFileImpl::RenameAndUniquify(
    const base::FilePath& full_path,
    const RenameCompletionCallback& callback) {
  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));

  base::FilePath new_path(full_path);

  int uniquifier =
      file_util::GetUniquePathNumber(new_path, FILE_PATH_LITERAL(""));
  if (uniquifier > 0) {
    new_path = new_path.InsertBeforeExtensionASCII(
        base::StringPrintf(" (%d)", uniquifier));
  }

...

}

興味のあるInsertBeforeExtension電話(リンク):ExtensionSeperatorPosition

// Find the position of the '.' that separates the extension from the rest
// of the file name. The position is relative to BaseName(), not value().
// This allows a second extension component of up to 4 characters when the
// rightmost extension component is a common double extension (gz, bz2, Z).
// For example, foo.tar.gz or foo.tar.Z would have extension components of
// '.tar.gz' and '.tar.Z' respectively. Returns npos if it can't find an
// extension.
StringType::size_type ExtensionSeparatorPosition(const StringType& path) {
  // Special case "." and ".."
  if (path == FilePath::kCurrentDirectory || path == FilePath::kParentDirectory)
    return StringType::npos;

  const StringType::size_type last_dot =
      path.rfind(FilePath::kExtensionSeparator);

  // No extension, or the extension is the whole filename.
  if (last_dot == StringType::npos || last_dot == 0U)
    return last_dot;

  const StringType::size_type penultimate_dot =
      path.rfind(FilePath::kExtensionSeparator, last_dot - 1);
  const StringType::size_type last_separator =
      path.find_last_of(FilePath::kSeparators, last_dot - 1,
                        arraysize(FilePath::kSeparators) - 1);

  if (penultimate_dot == StringType::npos ||
      (last_separator != StringType::npos &&
       penultimate_dot < last_separator)) {
    return last_dot;
  }

  for (size_t i = 0; i < arraysize(kCommonDoubleExtensions); ++i) {
    StringType extension(path, penultimate_dot + 1);
    if (LowerCaseEqualsASCII(extension, kCommonDoubleExtensions[i]))
      return penultimate_dot;
  }

  StringType extension(path, last_dot + 1);
  for (size_t i = 0; i < arraysize(kCommonDoubleExtensionSuffixes); ++i) {
    if (LowerCaseEqualsASCII(extension, kCommonDoubleExtensionSuffixes[i])) {
      if ((last_dot - penultimate_dot) <= 5U &&
          (last_dot - penultimate_dot) > 1U) {
        return penultimate_dot;
      }
    }
  }

  return last_dot;
}
于 2013-03-27T12:34:35.827 に答える
0

よく知られているファイル拡張子のリストを使用していると思います。これも実行できます。さまざまな方法があります(たとえば、正規表現を使用するなど、私のソリューションよりもパフォーマンスが優れている可能性があります)が、これは非常に単純なソリューションです。

import os

known_extensions = ['.tar.gz', '.tar.bz2']
def splitext(file_name):
    file_name = file_name.strip()

    for ex in known_extensions:
        if file_name[-len(ex):] == ex:
            return file_name[:-len(ex)], ex

    return os.path.splitext(file_name)
于 2013-03-27T12:04:52.920 に答える