2013-08-27 2 views
1

Проблема, которую я должен решить, - это сократить пути к файлам, заданные пользователем. Если вы этого не знаете, иногда в командной строке невозможно вводить пути с пробелами. Вам необходимо либо поместить путь в кавычки, либо переименовать пути с пробелами в «abcdef ~ 1».Изменение строки JavaScript (возможно, включает в себя регулярное выражение)

Пример: «C: \ Some Folder \ Some File.exe» должен стать «C: \ SomeFo ~ 1 \ SomeFi ~ 1.exe» (без учета регистра).

Я делаю функцию в JavaScript, чтобы попытаться сократить пути к файлам, используя эту идею.

function ShortenFilePath(FilePath){ 
    var Sections = FilePath.split("\\") 
    for (Index = 0; Index < Sections.length; Index++){ 
     while (Sections[Index].length > 6 && Sections[Index].match(" ") && !Sections[Index].match("~1")){ 
      alert(Sections[Index]) 
      Sections[Index] = Sections[Index].replace(" ","") 
      Sections[Index] = Sections[Index].substring(0,6) 
      Sections[Index] = Sections[Index] + "~1" 
      alert(Sections[Index]) 
     } 
    } 
    var FilePath = Sections.join("\\") 
    alert(FilePath) 
    return FilePath 
} 

Проблема заключается в том, что уйдет из расширения файла и выплюнуть "C: \ SomeFo ~ 1 \ SomeFi ~ 1". Мне нужна помощь в получении этого расширения файла (возможно, через регулярное выражение). Если вы чувствуете, что эту функцию можно оптимизировать, пожалуйста, поделитесь своими мыслями.

ОБНОВЛЕНИЕ: Я считаю, что проблема решена.

ОБНОВЛЕНИЕ 2: Были проблемы с предыдущим кодом, поэтому я немного пересмотрел его.

ОБНОВЛЕНИЕ 3: свежий новый проблема. Хлоп. Если имя самого файла без расширения составляет менее 7 букв, оно будет отображаться как «name.e ~ 1.exe».

ОБНОВЛЕНИЕ 4: Я думаю, что я, наконец, исправил проблему. Я ДУМАЮ.

function ShortenFilePath(FilePath){ 
    var Sections = FilePath.split("\\") 
    Sections[Sections.length - 1] = Sections[Sections.length - 1].substring(0,Sections[Sections.length - 1].lastIndexOf(".")) 
    for (Index = 0; Index < Sections.length; Index++){ 
     while (Index > 0 && Sections[Index].match(" ") && !Sections[Index].match("~1")){ 
      Sections[Index] = Sections[Index].replace(/ /gm,"") 
      Sections[Index] = Sections[Index].substring(0,6) + "~1" 
     } 
    } 
    return Sections.join("\\") + FilePath.substring(FilePath.lastIndexOf(".")) 
} 
+0

Как вы знаете, короткое имя файла: 'longfilename.txt 'is:' LONGFI ~ 1.TXT'? Вероятно, это также может быть: 'LONGFI ~ 2.TXT' или:' LONGFI ~ 3.TXT. – ridgerunner

ответ

0

Я хотел бы использовать это, чтобы получить расширение:

someString.substring(someString.lastIndexOf(".")) 

вы также просили какой-то проверки кода, так:

1 - Ваши JS конвенции поодаль, он выглядит более как C# :) Почему заглавная буква в именах переменных и методов?

2 - Вы сказали, что можете использовать опцию quotes вместо использования ~ 1, кажется, проще, почему вы решили не делать этого?

3 - Зачем вам что-то подобное в вашем JS?

+0

1. Я не много играл с JavaScript. Я делаю большую часть своих сценариев в RBX.Lua (ROBLOX Lua). Я использую все, потому что меня поддерживает OCD. : P 2. Параметр quotes имеет конфликты с другими скриптами. 3. Я создаю веб-страницу для себя, чтобы запускать некоторые вещи на компьютерах, которые блокируют почти все. Нет, я ничего не взламываю. Я просто хочу иметь возможность запускать Minecraft. –

+0

1. Нельзя спорить с этим! 2. Не можете ли вы исправить это с помощью простого экранирования? –

+0

Я попытался использовать \ x22 и \ ", чтобы убежать, но они всегда в конечном итоге что-то не так. Кстати, ваш метод работал красиво. –

0

Как об этом:

function ShortenFilePath(FilePath){ 
    var Sections = FilePath.split("\\") 
    var suffix = FilePath.match(/(\..*$)/) 
    for (Index = 0; Index < Sections.length; Index++){ 
     while (Sections[Index].length > 6 && Sections[Index].match(" ") && !Sections[Index].match("~1")){ 
      alert(Sections[Index]) 
      Sections[Index] = Sections[Index].replace(" ","") 
      Sections[Index] = Sections[Index].substring(0,6) 
      Sections[Index] = Sections[Index] + "~1" 
      alert(Sections[Index]) 
     } 
    } 
    var FilePath = Sections.join("\\") + (suffix? suffix[1] : '') 
    alert(FilePath) 
    return FilePath 
} 
0

Вы можете использовать String.prototype.replace с обратным вызовом:

function ShortenFilePath(FilePath){ 
    return FilePath.replace(/([^:\\]+)([\\|\.[^\\]+)/g, function(text,match1, match2){ 
     return match1.length > 8 ? match1.replace(' ', '').substr(0, 6) + '~1' + match2 : match1.replace(' ', '') + match2; 
    });  
} 

Я не 100% уверен, что это будет выводить excactly то, что вам нужно, но, вероятно, вы получите идею :)
jsFiddle

0

Fix для UPDA т.е # 3 проблемы:

if (FilePath.lastIndexOf(".") > 6){ 
    Sections[Index] = Sections[Index].substring(0,6) + "~1" 
} else { 
    Sections[Index] = Sections[Index].substring(0, FilePath.lastIndexOf(".")) + "~1" 
} 

И кстати, это:

while (Sections[Index].match(" ")){ 
    Sections[Index] = Sections[Index].replace(" ","") 
} 

Если, вероятно, выглядеть следующим образом:

Sections[Index] = Sections[Index].replace(/ /gm, ""); 
+0

Я использовал ваше второе предложение, но я думаю, что исправил основную проблему. Спасибо за вашу помощь. –

Смежные вопросы