Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как получить полный путь каталога "Рабочий стол" [D6, Win95/98, WinME, Win2k, WinXP]


Страницы:   1 2

officeman ©   (2005-08-23 10:28:00) 

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

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


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

Поправки:

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

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


Officeman   (2005-08-26 13:26:00) [2]

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

Программа лежит здесь:
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.


dmitry501   (2005-08-26 06:58:00) [3]

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.

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


Anatoly Podgoretsky   (2005-08-25 21:21:00) [4]

Безнадега.


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

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

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

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

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


Leonid Troyanovsky   (2005-08-25 14:25:00) [6]


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



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

--
Regards, LVT.


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

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

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


Polevi   (2005-08-25 14:14:00) [8]

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


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

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

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

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


wal   (2005-08-25 13:06:00) [10]


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

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

С уважением.


dmitry501   (2005-08-25 12:56:00) [11]

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


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

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

c Уважением,


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

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

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

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


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


> officeman   (25.08.05 12:14) [22]

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

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


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

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

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

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


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

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


wal   (2005-08-25 10:06:00) [17]


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

С уважением.


Leonid Troyanovsky   (2005-08-25 09:45:00) [18]


> officeman   (25.08.05 09:32) [18]

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


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

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

--
Regards, LVT.


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

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

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


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


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


> officeman   (24.08.05 13:15) [13]


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


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

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо