Войти

Показать полную графическую версию : [решено] как сделать относительную ссылку (*.lnk)


pva
30-11-2008, 14:03
Не знал, в какую тему отнести. Сюда показалось наиболее логичным. Вопрос такой: можно ли, а если можно то как создать в винде на диске относительную ссылку?
Например, стуктура файлов:

[+] SOME_ROOT
|-[+] Рабочее место
| |-[+] Cисадмин
| | |-- codecs.lnk -> SOME_ROOT/Хранилище/codecs
| | '-- nero.lnk -> SOME_ROOT/Хранилище/nero
| '--[-] Бухгалтер
|-[+] Video
| |-- powerdvd.lnk -> SOME_ROOT/Хранилище/powerdvd
| '-- codecs.lnk -> SOME_ROOT/Хранилище/codecs
|-[+] Audio
| |-- powerdvd.lnk -> SOME_ROOT/Хранилище/powerdvd
| '-- codecs.lnk -> SOME_ROOT/Хранилище/codecs
|-[+] CD/DVD
| |-- powerdvd.lnk -> SOME_ROOT/Хранилище/powerdvd
| '-- nero.lnk -> SOME_ROOT/Хранилище/nero
|-[+] Хранилище
| |--[-] qip
| |--[-] nero
| |--[-] codecs
| |--[-] nero
...

Чтобы куда б не примонтировать (на какую-нить букву диска или папку), всегда бы при нажатии на ярлык правильно находился путь.
Задача возникла из следующих соображений: есть архив, лень использовать специальный софт, зато нравится ходить по папочкам. Когда программу можно отнести к разным группам - постоянно забываю, где искать. Потом ещё возникает вопрос, куда помещать универсальную программу, которую вроде и туда и сюда поместить хочется.

pva
30-11-2008, 14:21
Нашёл 2 решенния:
1. %windir%\system32\RunDll32.exe shell32.dll,ShellExec_RunDLL ..\photo
http://doitq.blogsome.com/2007/01/23/p118/

2. explorer ..\photo

Ещё хочу. Попроще и применительней к задаче

Admiral
30-11-2008, 15:06
А такой вариант?
На жестком диске - Чисто символически (http://vadikan.spaces.live.com/blog/cns!3270464DC78ABAEE!264.entry) »
На счёт того будет ли работать после перемонтировки не уверен.

Поздравляю с 500м постом!
http://s40.radikal.ru/i087/0811/53/03f382cf0174.gif

pva
30-11-2008, 15:18
как её сделать? хочу попробовать Windows XP sp2
а, сори, увидел утилиту junction. Щас попробуем

pva
30-11-2008, 16:07
Где скачать утилиту после пары тыков мышкой не нашёл. Зато нашёл в МСДН про жёсткие ссылки, сделал утилитку:

#include <windows.h>
#include <iostream>
using namespace std;


int main(int argc, char**argv)
{
if (2 < argc)
{
typedef int __stdcall (*CreateHardLink_type)(char*, char*, SECURITY_ATTRIBUTES*);

CreateHardLink_type CreateHardLink = reinterpret_cast<CreateHardLink_type>(
GetProcAddress(GetModuleHandle("kernel32.dll"), "CreateHardLinkA"));

if (CreateHardLink)
{
int result = CreateHardLink(argv[1], argv[2], 0);
if (!result) clog << "os error " << GetLastError() << "\n";
return result;
}
else
{
cout << "cannot find kernel32.dll::CreateHardLinkA function\n";
return 0;
}
}

cout << "hard_link.exe \"link_name\" \"file_path\"\n"
"creates NTFS hard link to file using CreateHardLink function\n";

return 0;
}

Работает зашибенно! По сетке тоже. Только ссылаться можно внутри одного тома

Admiral
30-11-2008, 16:35
pva, в записи (http://vadikan.spaces.live.com/blog/cns!3270464DC78ABAEE!264.entry) блога Vadikan'а приведенна ссылка http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx, вот прямая http://download.sysinternals.com/Files/Junction.zip

pva
30-11-2008, 20:10
junction не работает с файлами :( а CreateHardLink не захотела с папками

Delirium
01-12-2008, 02:00
junction не работает с файлами а CreateHardLink не захотела с папками »
А ты проверяй перед созданием, если файл, то используй CreateHardLink и наоборот :)

Admiral
01-12-2008, 03:52
pva, вероятно Руссинович использовал не документированные функции.
Обзор исходника одноимённой проги Windows 2000 Junction Points (http://www.codeproject.com/KB/winsdk/junctionpoints.aspx) там как раз говорится про недокументированный подход.




© OSzone.net 2001-2012