Копировать как путь на с#

prostors

Client
Регистрация
16.12.2020
Сообщения
986
Благодарностей
33
Баллы
28
Привет. Как взять путь к файлу с помощью зенки с#
Действие из контекстного меню

file:///C:/Users/p***t/Dropbox/zip/TAIF19~1.KLP/4BD3~1/-51209~1.2KK/3E9EC~1.3/3E9EC~1.3/30B03~1/190006~1/190006~1/190006~1/133120~1.PDF

надо вот такое со знаками ~
120800 вот это действие даёт путь без ~

нужно вот это действие
120802
для случая, когда путь более 260 символов преобразует в путь со знаками ~
 
Последнее редактирование:

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 755
Благодарностей
1 431
Баллы
113
Привет. Как взять путь к файлу с помощью зенки с#
Действие из контекстного меню

file:///C:/Users/p***t/Dropbox/zip/TAIF19~1.KLP/4BD3~1/-51209~1.2KK/3E9EC~1.3/3E9EC~1.3/30B03~1/190006~1/190006~1/190006~1/133120~1.PDF

надо вот такое со знаками ~
Посмотреть вложение 120800 вот это действие даёт путь без ~

нужно вот это действие
Посмотреть вложение 120802
для случая, когда путь более 260 символов преобразует в путь со знаками ~
120803

C#:
string filePath = "file:///C:/Users/p***t/Dropbox/zip/TAIF19~1.KLP/4BD3~1/-51209~1.2KK/3E9EC~1.3/3E9EC~1.3/30B03~1/190006~1/190006~1/190006~1/133120~1.PDF";
Uri uri = new Uri(filePath.Replace("~", "%7E"));
project.Variables["newPath"].Value = uri.LocalPath;
 
  • Спасибо
Реакции: izubr

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 497
Благодарностей
3 361
Баллы
113
Будет работать только на тех разделах, что поддерживают короткие пути.
Пример общего кода:
using System.Runtime.InteropServices;

namespace ZennoLab.OwnCode
{
    /// <summary>
    /// A simple class of the common code
    /// </summary>
    public class CommonCode
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
        public static extern int GetShortPathNameW(
            string path,
            StringBuilder shortPath,
            int shortPathLength
         );
    
        [DllImport("api-ms-win-core-path-l1-1-0.dll", CharSet = CharSet.Unicode)]
        public static extern int PathCchStripPrefix(
            StringBuilder  pszPath,
            int cchPath
        );
    
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();

        // Insert your code here
    }
}
В сниппете:
StringBuilder shortPath = new StringBuilder(255);
int result = CommonCode.GetShortPathNameW(
    @"\\?\" + project.Variables["filePath"].Value, shortPath, shortPath.Capacity
);

if(result == 0) {
    throw new Exception(@"Не удалось получить короткий путь.");
}

int result2 = CommonCode.PathCchStripPrefix(shortPath, shortPath.Capacity);

if(result2 != 0) {
    throw new Exception(@"Не удалось удалить префикс \\?\ перед коротким путём.");
}

return shortPath.ToString();
 
Последнее редактирование:
  • Спасибо
Реакции: prostors

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)