Текущий архив: 2005.10.30;
Скачать: CL | DM;
Внизкак получить полный путь каталога "Рабочий стол" Найти похожие ветки
← →
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 вся ветка
Текущий архив: 2005.10.30;
Скачать: CL | DM;
Память: 0.58 MB
Время: 0.044 c