Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

как получить полный путь каталога "Рабочий стол"   Найти похожие ветки 

 
officeman   (2005-08-23 10:28) [0]

как получить полный путь каталога "Рабочий стол", независимо от версии виндовс, и установки виндовса. Возможно из реестра ?

p.s. утилитка проверяет, изменился ли файл по указанному пути.
если "файл изменился" тогда копирую его СЕБЕ на рабочий стол.
иначе // конец.


 
begin...end ©   (2005-08-23 10:38) [1]

Для текущего пользователя:

var
 Path: array [0..MAX_PATH] of Char;
begin
 if ShGetSpecialFolderPath(Application.Handle, Path, CSIDL_DESKTOPDIRECTORY, False) then
   ShowMessage(Path)
end


 
begin...end ©   (2005-08-23 10:39) [2]

В список uses нужно добавить модуль ShlObj.


 
officeman   (2005-08-23 12:46) [3]

Спасибо! Работает!


 
officeman   (2005-08-23 15:50) [4]

то "begin...end ©"
как получить тоже самое но для сетевого диска. например мне надо получить путь рабочего стола с:  "\\id4\c\"

p.s. куда копировать ты мне помог. а держать путь "от куда" в теле программы это не логично. держать отдельный файл типа ini или text
тоже не логично. хочу чтобы имя программы заключало в себе источник "хранилище"...

т.е. файл программа имеет вид например  id4-c.exe
это будет обрабатыватся как "\\id4\c"

ну чтото типо этого вобщем.

спасибо по помощь.


 
officeman   (2005-08-23 21:28) [5]

to "begin...end"

-ау


 
Virgo_Style ©   (2005-08-23 21:45) [6]

officeman   (23.08.05 15:50) [4]
т.е. файл программа имеет вид например  id4-c.exe
это будет обрабатыватся как "\\id4\c"


Узнать имя программы можно из Application.ExeName или ParamStr(0). Выделять различные части из полного пути можно семейством функций ExtractFile... .

Надеюсь, что угадал, чего тебя интересует - честно говоря, из [4] мне трудно понять, чего же ты хочешь =)


 
Zeqfreed ©   (2005-08-23 21:58) [7]

officeman   (23.08.05 15:50) [4]
А зачем вообще держать путь "от куда"? Опиши задачу более ясно, а то трудно понять, чего же ты хочешь =)(С)Virgo_Style ©   (23.08.05 21:45) [6]


 
officeman   (2005-08-24 08:09) [8]

утилитка. для копирования файлов с сервера. т.е. после запуска. проверяет "существует" ли файл (\\server\...\рабочий стол\_*.xls)
(в нашем случае - это прайс-лист). если существует, то копируем его - себе на рабочий стол.

уже работает:
определение существует ли файл(по маске "_") в указанном пути*
и его копирование к себе на рабочий стол.

сноски(*)  
пути*- путь держу в теле программы. не хочу использовать для этого доп.текстовые файлы.

Не работает. Надо сделать:
хочу определять сетевой путь каталога "Рабочий Стол" - сервера.
Чтобы автоматом брать с раб.стола сервера и копировать на собственный раб.стол (моего компьютера).

p.s. надеюсь понятно объяснил.


 
officeman   (2005-08-24 08:11) [9]

begin
str_from:="\\Id4\c\Documents and Settings\Administrator\Рабочий стол\"; //из

if ShGetSpecialFolderPath(Application.Handle, Path, CSIDL_DESKTOPDIRECTORY, False) then //ShowMessage(Path);
str_to:=Path;                                                    //куда
setmask:="_*.xls";                                                     //маска

FindFirst(str_from+setmask, faAnyFile, sr);
if FileExists(str_from+sr.Name) then begin//если файл есть то копируем его, иначе нет.
//showmessage("yes")
OldFile := TFileStream.Create(str_from+sr.Name,fmOpenRead or fmShareDenyWrite);
NewFile := TFileStream.Create(str_to+"\"+DateToStr(Date)+" "+sr.Name,fmCreate or fmShareDenyRead);
NewFile.CopyFrom(OldFile, OldFile.Size);
timer2.enabled:=true;
timer1.Enabled:=false;  // закрыть приложение
end else begin
//showmessage("not file");
//...//закрываем приложение
end;
end;


 
officeman   (2005-08-24 12:14) [10]

эх...жаль..


 
Плохиш ©   (2005-08-24 12:23) [11]


> officeman   (24.08.05 08:11) [9]
> begin
> str_from:="\\Id4\c\Documents and Settings\Administrator\Рабочий
> стол\"; //из

Начинающие хацкеры


 
dmitry501 ©   (2005-08-24 12:26) [12]

Храни прайс-листы на специальном сетевом ресурсе, доступном тем, кому нужно. И все твои проблемы отпадут сами...


 
officeman   (2005-08-24 13:15) [13]

to Плохиш
при чём тут хакеры? пишу утилитку для своего офиса.
Если можешь помочь, помоги. не откажи...

to dmitry501
действительно оригинальные файлы прайс-листов хранятся на сетевом ресурсе. я нехочу чтобы какойто чайник - менеджер попортил их.
или ком.директор не туда нажал. пусть лучше с копиями работают.
Безопастность данных превыше всего...........

с Уважением, Officeman


 
Polevi ©   (2005-08-24 13:57) [14]

напиши скрипт на вход в домен


 
officeman   (2005-08-24 14:26) [15]

to Polevi, типа скрипт для копирования файла? это же неинтересно.


 
Polevi ©   (2005-08-24 15:09) [16]

тебе шашечки ?


 
Плохиш ©   (2005-08-24 15:26) [17]


> officeman   (24.08.05 13:15) [13]


> действительно оригинальные файлы прайс-листов хранятся на
> сетевом ресурсе


> хочу определять сетевой путь каталога "Рабочий Стол" - сервера

Не вижу связи.

"Рабочий стол" - это понятие локальное.


 
officeman   (2005-08-25 09:32) [18]

to Плохиш.
надо с одного рабочего стола компьютера копировать файлы на другой рабочий стол другого компьютера. Внутри сети - между рабочими станциями, которые в свою очередь имеют разные ip адреса и разные имена.

Данный код выделяет Полный путь к локальной директории "Рабочего стола":
if ShGetSpecialFolderPath(Application.Handle, Path, CSIDL_DESKTOPDIRECTORY, False) then ShowMessage(Path);


Возможно ли определить полный путь к директории "Рабочий стол",
для другого компьютера находящегося в сети?


 
Leonid Troyanovsky ©   (2005-08-25 09:45) [19]


> officeman   (25.08.05 09:32) [18]

> Возможно ли определить полный путь к директории "Рабочий
> стол",
> для другого компьютера находящегося в сети?


Например, через удаленный реестр.

Токмо все это лишнее, бо
не надо умножать сущности сверх необходимого.

--
Regards, LVT.


 
wal ©   (2005-08-25 10:06) [20]


> Возможно ли определить полный путь к директории "Рабочий
> стол",
> для другого компьютера находящегося в сети?
У удаленного компьютера, как такового, вообще-то рабочего стола нет. Рабочий стол есть у пользователя, работающего (работавшего) на том компьютере. ИМХО, проще сделать так - где-то в сети расположить твой прайс-лист, на рабочие столы пользователям раскидать ссылки, разрулить правами, кому редактировать, а кому только читать.

С уважением.


 
Polevi ©   (2005-08-25 10:21) [21]

>wal ©   (25.08.05 10:06) [20]
[15]


 
officeman   (2005-08-25 12:14) [22]

хорошо. как програмно узнать - пусть к директории "Рабочий стол",
зная:
-сетевое имя компьютера "\\id4"
-имя пользователя "Administrator" (или без имени пользователя)

т.е. как быстро найти файл реестра на удалённой машине? толкьо через findfirst ? потом ищем ветку типа:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
которая имеет значение:
C:\Documents and Settings\Administrator\Рабочий стол

может можно поумнее?


 
Плохиш ©   (2005-08-25 12:23) [23]


> officeman   (25.08.05 12:14) [22]

Мда, товарищ не понимает. Да и пофиг, его проблемы.

PS. HKEY_CURRENT_USER - ключ реестра, для текущего зарегестрировшегося пользователя на компьютере.
Запусти regedit, подключись к другому компьютеру и удивись.


 
Officeman   (2005-08-25 12:46) [24]

Думаю это вы не понимаете. Я, как раз всё прекрасно понимаю.
и не надо мне повторять одни и те же мессаги.

прошу Администрацию, удалить сей топ!
Спасибо всем участникам топа за ответы!

с Уважением, Officeman


 
Officeman   (2005-08-25 12:48) [25]

to Плохиш
если бы Вы читали внимательно, но не задавали бы глупых вопросов и изначально поняли бы мою затею.

c Уважением,


 
dmitry501 ©   (2005-08-25 12:56) [26]

Зачем тебе удаленный рабочий стол? Пусть человек, который отвечает за прайсы формирует их на сетевом ресурсе. Остальным они доступны только для чтения... И неважно, твоя программка, или сам менеджер их оттуда скопирует на свой рабочий стол и посмотрит. Путь к сетевому ресурсу заранее известен, и не нужно искать путь к удаленному рабочему столу.


 
wal ©   (2005-08-25 13:06) [27]


> как быстро найти файл реестра на удалённой машине? толкьо
> через findfirst ?
Файл реестра искать не нужно, ножно просто подключиться к удаленному реестру (на том компе соответствующая служба должна работать).

> потом ищем ветку типа:
> HKEY_CURRENT_USER\...
Такой ветки не существует, как и ложки. Она виртуальная, точнее псевдоним ветки HKEY_USERS\SID. Так вот, тебе сначала нужно по имени этот SID узнать, а потом уже копаться в (чужом) реестре.

С уважением.


 
Officeman   (2005-08-25 13:54) [28]

to dmitry501
если путь известен то проблем нет. а если путь неизвестен, а известно лишь сетевое имя машины и имя current пользователя.

я всегда стараюсь писать программы которые сами настраиваются
в системе. если я ненайду решения к своему вопросу. то скорее
всего буду при первом запуске просить пользователя указать путь
к файлу. затем буду записывать этот путь в реестр. а при следующих запусках - просто читать этот путь из реестра.

to wal
обэтом я неподумал. что за SID и с чем его едят. гугл мне в помощь. =) копаться в реестре я вообще нехочу, но видимо придётся.


 
Polevi ©   (2005-08-25 14:14) [29]

бедные пользователи, неинтересно ему
а вот им канечна будет очень интересно путь этот указывать


 
officeman   (2005-08-25 14:18) [30]

to Polevi
о чём и речь! я не хочу обременять пользователя.! хочу чтобы программа сама знала путь к рабочему столу компа "\\id4"

или я говорю на китайском, что меня мало кто здесь понимает????


 
Leonid Troyanovsky ©   (2005-08-25 14:25) [31]


> officeman   (25.08.05 14:18) [30]
> о чём и речь! я не хочу обременять пользователя.! хочу чтобы
> программа сама знала путь к рабочему столу компа "\\id4"



Ну тебе ж объясняли, что это д.б. расшаренная папка.
И зачем пользователям знать путь до чьего-то рабочего стола.
Ведь, если имя ресурса известно, то его можно и найти.

--
Regards, LVT.


 
officeman   (2005-08-25 21:16) [32]

ДА я и не оспаривал обратного. Директория расшарена - доступ полный. Только я незнаю имени пользователя и какая ОС установлена. т.е. я знаю \\id4\c\....\Рабочий Стол, и я знаю что доступ к директории "Рабочий Стол" по сети открыт.

Просто нужно програмно достать полный сетевой путь удалённого "Рабочего Стола". зная лишь \\id4\c\...\Рабочий Стол.

Кажется виндовая программа "regedt32.exe" имеет возможность смотреть удалённый реестр(подключив удалённый комп)...
при этом доступна папка HKEY_LOCAL_MACHINE (удалённого реестра)
как то же самое сделать програмно?????
как ваще получить путь к рабочему столу! =)

p.s. я наверно всех уже достал =) этим своим вопросом.
щас сам ковыряю hlp и винду. Если кто может помочь - буду благораден


 
Anatoly Podgoretsky ©   (2005-08-25 21:21) [33]

Безнадега.


 
dmitry501 ©   (2005-08-26 06:58) [34]

officeman   (25.08.05 21:16) [32]
ААААААА!!!!!!!!!!!!!!!!
Вот смотри:
Открой в Delphi новый проект, кинь на него ListView, установи свойство ViewStyle=vsList, кинь кнопку и напиши код
type
 PNetResourceArray = ^TNetResourceArray;
 TNetResourceArray = array[0..MaxInt div SizeOf(TNetResource) - 1] of
   TNetResource;

procedure EnumResources(LpNR: PNetResource);
// by Nomadic, Михаил Немцов
var
 NetHandle: DWORD;
 BufSize: DWORD;
 Size: DWORD;
 NetResources: PNetResourceArray;
 Count: DWORD;
 NetResult: Integer;
 I: Integer;
 NewItem: TListItem;
begin
 if WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, LpNR, NetHandle) <>
   NO_ERROR then
   Exit;
 try
   BufSize := 50 * SizeOf(TNetResource);
   GetMem(NetResources, BufSize);
   try
     while True do
     begin
       Count := 1;
       Size := BufSize;
       NetResult := WNetEnumResource(NetHandle, Count, NetResources, Size);
       if NetResult = ERROR_MORE_DATA then
       begin
         BufSize := Size;
         ReallocMem(NetResources, BufSize);
         Continue;
       end;
       if NetResult <> NO_ERROR then
         Exit;
       for I := 0 to Count - 1 do
       begin
         with NetResources^[I] do
         begin
           if RESOURCEUSAGE_CONTAINER = (DwUsage and RESOURCEUSAGE_CONTAINER)
             then
             EnumResources(@NetResources^[I]);
           if dwDisplayType = RESOURCEDISPLAYTYPE_SHARE then
             // ^^^^^^^^^^^^^^^^^^^^^^^^^ - ресурс
             // RESOURCEDISPLAYTYPE_SERVER - компьютер
             // RESOURCEDISPLAYTYPE_DOMAIN - рабочая группа
             // RESOURCEDISPLAYTYPE_GENERIC - сеть
           begin
             NewItem := Form1.ListView1.Items.Add;
             NewItem.Caption := LpRemoteName;
           end;
         end;
       end;
     end;
   finally
     FreeMem(NetResources, BufSize);
   end;
 finally
   WNetCloseEnum(NetHandle);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 OldCursor: TCursor;
begin
 OldCursor := Screen.Cursor;
 Screen.Cursor := crHourGlass;
 with ListView1.Items do
 begin
   BeginUpdate;
   Clear;
   EnumResources(nil);
   EndUpdate;
 end;
 Screen.Cursor := OldCursor;
end;

end.

Запусти, в списке увидишь расшаренные ресурсы в своей сети в виде \\компьютер\шара
Вот и ищи свои файлы в них.
Уф.....


 
Officeman   (2005-08-26 13:26) [35]

это то, что я хотел сделать и то что уже сделал:

Программа лежит здесь:
http://www.ufa-prodayka.narod.ru/desktop.rar

Ну незнаю как там подход к программированию. Верный или Муторный.
для меня важно лишь то, что я добился поставленной цели.
как говорится меньше болтай  - больше делай.

Ограничения версии:
---------------------------------------------------
Программа  тестировалась только на win 2000,
д.работать на win xp.

Действие:

---------------------------------------------------
Программа копирует файл с удалённого рабочего стола
на локальный рабочий стол, по определённо заданной маске.
Настрока маски задаётся в самом имени программы.

Например:
---------------------------------------------------

id4.!.dbf.exe  
   означает: \\id4\....\Рабочий Стол\_*.dbf  
      ,копирует файл формата dbf, с именем начинающимся на "!"

 id4.$.doc.exe  
   означает: \\id4\....\Рабочий Стол\$*.doc  
      ,копирует файл формата doc, с именем начинающимся на "$"

Параметры по умолчанию:
---------------------------------------------------
 
  "_" идентификатор заданный по умолчанию
"xls" расширение заданное по умолчанию

 
 id4.exe
    означает: \\id4\....\Рабочий Стол\_*.xls  
      ,копирует файл формата xls, с именем начинающимся на "_"

Примечение:
--------------------------------------------------
Доступ к удалённому диску должен быть открыт ;)
Вся остальная информация, о размещении директории "Рабочий Стол",
а также имя текущего(активного) пользователя читается из реестра
удалённого компьютера.

Разработка
--------------------------------------------------
ведётся


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ShlObj, ExtCtrls, Registry;

type
   TForm1 = class(TForm)
   Timer2: TTimer;
   Label1: TLabel;
   Edit1: TEdit;
 procedure Timer2Timer(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormShow(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 sr: TSearchRec;
 NewFile: TFileStream;
 OldFile: TFileStream;
 str_from,str_to,setmask,compname,exename:string;
 f:file;
 Path: array [0..MAX_PATH] of Char;
 i,ai,ss,h1,ss11:integer;
 str,r_user,r_dir,r_dir2,ddrive,r_comp,ident:string;
 i2:integer;
 Reg: TRegistry;

implementation

{$R *.dfm}

procedure TForm1.Timer2Timer(Sender: TObject);
begin
 form1.close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
{
Используем имя файла "программы" для:
1)Выбор сетевого имени компьютера с рабочего стола которого будем брать
файл по специально установленному идентификатору (второй параметр)
2)Идентификатор файла. например "$Прайс-Лист.xls", где "$" - является идентификаором
}
ss11:=0;
form1.Caption:= ExtractFileName(Application.ExeName);
for ai:=1 to length(form1.Caption) do begin

if form1.Caption[ai]="." then begin
ss11:=ss11+1;
if ss11=1 then begin
compname:=(Copy(form1.Caption,1,ai-1));
//showmessage(compname);
h1:=ai;
end end;
if form1.Caption[ai]="." then begin
if ss11=2 then begin
ident:=(Copy(form1.Caption,h1+1,ai-h1-1));
//showmessage(ident);
h1:=ai;
end end;
if form1.Caption[ai]="." then begin
if ss11=3 then begin
exename:=(Copy(form1.Caption,h1+1,ai-h1-1));
//showmessage(exename);
end end;
//Значения по умолчанию
if ident="" then ident:="_";
if exename="" then exename:="xls";
end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
try
//ЗАГРУЖАЕМ РЕЕСТР
//Сброс
 ss:=0;ai:=0;h1:=0;
//Текущий Комп
 r_comp:=compname;
 Reg := TRegistry.Create;
 Reg.RootKey:=HKEY_LOCAL_MACHINE;
 if Reg.RegistryConnect("\\"+r_comp)=true then begin
 end;
//Текущий Пользователь
 Reg.OpenKey("\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon",true);
 r_user:=Reg.ReadString("AltDefaultUserName");
//Определяем Драйв
//1)Получаем путь к папке "WINDOWS"
 Reg.OpenKey("\SOFTWARE\Microsoft\Windows NT\CurrentVersion",true);
 r_dir2 :=Reg.ReadString("SystemRoot");
//2)Запонимаем DRIVE
 for ai:=1 to length(r_dir2) do begin
 if r_dir2[ai]=":" then begin
 ss:=ss+1;
 if ss=1 then begin
 ddrive:=Copy(r_dir2,ai-1,ai-1);
 h1:=ai;
 end;
 end;
 end;
//Сброс
 ss:=0;ai:=0;h1:=0;
//Полный путь к Рабочему Столу
//1)Получаем путь к папке "Documents and Settings"
 Reg.OpenKey("\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList",true);
 r_dir :=Reg.ReadString("ProfilesDirectory");
//2)Заменяем под строку "%SystemDrive%" на строку с Диском С:\ и добавл.Имя пользователя
 for ai:=1 to length(r_dir) do begin
 if r_dir[ai]="\" then begin
 ss:=ss+1;
 if ss=1 then begin
 edit1.text:="\\"+r_comp+"\"+ddrive+Copy(r_dir,ai,length(r_dir))+"\"+r_user+"\Рабочий стол";
 h1:=ai;
 end;
 end;
 end;
 Reg.Free;
finally
//--------------------------------------------------------------
str_from:=Edit1.Text; //из
if ShGetSpecialFolderPath(Application.Handle, Path, CSIDL_DESKTOPDIRECTORY, False) then
str_to:=Path;                                                    //куда
setmask:=ident+"*."+exename;
//showmessage(setmask);                                                  //маска
FindFirst(str_from+"\"+setmask, faAnyFile, sr);
if FileExists(str_from+"\"+sr.Name) then begin//если файл есть то копируем его, иначе нет.
OldFile := TFileStream.Create(str_from+"\"+sr.Name,fmOpenRead or fmShareDenyWrite);
NewFile := TFileStream.Create(str_to+"\"+DateToStr(Date)+" "+sr.Name,fmCreate or fmShareDenyRead);
NewFile.CopyFrom(OldFile, OldFile.Size);
timer2.enabled:=true;
//timer1.Enabled:=false;  // закрыть приложение
end else begin
//showmessage("not file");
timer2.enabled:=true;
//timer1.Enabled:=false;  // закрыть приложение
end;
end;
end;

end.


 
Officeman   (2005-08-26 14:32) [36]

Поправки:

-не работает по Win_XP : видимо есть проблемы при чтении  ключей реестра. необходимо напистаь модуль пределения версии винды.

-Доступ должен быть открыт на удалённом и локальном компьютерах.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.064 c
14-1128627345
default
2005-10-06 23:35
2005.10.30
Решение только что закрытой задачки...не зря же решал


8-1117729988
sashik
2005-06-02 20:33
2005.10.30
OenGL


4-1124968435
vvvaaa
2005-08-25 15:13
2005.10.30
Перетаскивание формы


3-1125345031
Piter
2005-08-29 23:50
2005.10.30
Коннект к базе в дополнительном потоке


2-1128534097
The Sound
2005-10-05 21:41
2005.10.30
Ошибка, при использовании ShellApi.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский