線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3674
推到 Plurk!
推到 Facebook!

如何新增一個目錄!!

尚未結案
allenlue
一般會員


發表:3
回覆:7
積分:2
註冊:2002-03-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-29 18:05:24 IP:61.221.xxx.xxx 未訂閱
請教各位先進!! 我已連線一個網路磁碟機..然後給一個磁碟代號為 R: 我用Delphi 7 寫了一段為 CreateDir('R:\aaa'),結果是順利的建立了一個 目錄. 但是我把同一個指令放到 Service Application(服務),卻無法順利建立一個 目錄吔~ 我該如何解決這個問題呢? 謝謝各位指教!!
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-29 20:12:10 IP:61.31.xxx.xxx 未訂閱
會不會是權限的問題。 要不然將部分程式碼擺上。
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-29 20:16:46 IP:220.135.xxx.xxx 未訂閱
Hi allenlue 你好: 先確認是否有R磁碟, Service有沒有載入, 並啟動? 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
allenlue
一般會員


發表:3
回覆:7
積分:2
註冊:2002-03-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-29 22:29:48 IP:211.76.xxx.xxx 未訂閱
1.權限沒有問題.因為我是用administrator登入的 2.Service 當然有啟動 3.當然也有R磁碟 程式碼很簡單.. 就只有 CreateDir('R:\aaa'); 這樣而已.. 我覺得應該是要有 Initialize 動作才能使用...
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-29 23:40:00 IP:61.31.xxx.xxx 未訂閱
我測試過,完全正常可以建立 CreateDir 無誤 !
allenlue
一般會員


發表:3
回覆:7
積分:2
註冊:2002-03-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-30 00:22:28 IP:211.76.xxx.xxx 未訂閱
那你如果把他放進 Thread 呢!?
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-30 00:40:38 IP:221.169.xxx.xxx 未訂閱
allenlue:程式放到 Service Application(服務),於網路磁碟機建立新 目錄,幾個問題請教: 一、Service Application一開機就啟動,但區域連線是否啟動。 二、是否人工執行Service Application程式一樣也無法建立目錄。 我認為你應該是第一項。最簡單方式試圖讀取R:成功後再執行建立目錄; 或是等待一小段時間再執行建立目錄。 請參考! Andy Chang
------
Andy Chang
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-30 00:51:42 IP:61.31.xxx.xxx 未訂閱
同意 andychang1690 大大所言。
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-30 01:19:29 IP:61.31.xxx.xxx 未訂閱
Hi allenlue 你好: 請問你寫在哪一個Event是否為OnExecute或其他? 我測試的結果也是正常, 但我是建立在C磁碟, 不曉得怎麼又會出現Thread, 是否有特殊需求? 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
allenlue
一般會員


發表:3
回覆:7
積分:2
註冊:2002-03-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-30 09:33:32 IP:211.76.xxx.xxx 未訂閱
我自己也是有試過.. 建立在自己的電腦上是都沒有問題的! 我的 Service 最主要是跑排程用的! 定時會去備份某些目錄. 然後拷貝到已連線中的網路磁碟機. 但又因在拷貝時會浪費CPU的資源,因為在跑備份時CPU都衝到100%, 所以我就把複製的動作放到Thread裡去了! 但是問題來了. 沒把他放進Thread裡時,所有動作都是正常的! 但放進Thread裡,卻無法建立目錄,也無法複製檔案到網路磁碟裡去! 就連ADO元件也一樣無法執行~ 但ADO方面我已解決,也找出問題了. 唯獨複製檔案會無法順利的複製到網路磁碟!
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-10-30 13:22:54 IP:61.31.xxx.xxx 未訂閱
我想應該不是 Service 的問題。 應該為您的 Thread 沒有寫好的關係導致。
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-10-30 14:59:51 IP:61.31.xxx.xxx 未訂閱
參考看看 http://delphi.ktop.com.tw/topic.php?topic_id=40937 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
allenlue
一般會員


發表:3
回覆:7
積分:2
註冊:2002-03-18

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-10-30 23:48:57 IP:211.76.xxx.xxx 未訂閱
可能是各位都不瞭解我的意思吧! 我的 Thread 確定沒問題啦~ 我認為應該要 Initialize . 但我不知道應該要用哪一個!!
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-10-31 22:59:23 IP:221.169.xxx.xxx 未訂閱
allenlue:先聲明我使用BCB(因為我沒有Delphi),但於Thread多執行緒環境。 不論使用CreateDir();或mkdir();//include dir.h 都沒問題,於檔案總管內我除了宣告欲連線的網路磁碟機遠端目錄為共用外。 也必須勾選允許網路使用者變更我的檔案。沒有你所謂的問題!可能你需要 Post部分程式方便檢查! Andy Chang
------
Andy Chang
allenlue
一般會員


發表:3
回覆:7
積分:2
註冊:2002-03-18

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-11-01 09:30:49 IP:61.221.xxx.xxx 未訂閱
以下是完整的程式碼!! 請各位幫忙..謝謝各位~ unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs; type TService1 = class(TService) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { Private declarations } public function GetServiceController: TServiceController; override; { Public declarations } end; var Service1: TService1; implementation {$R *.DFM} procedure ServiceController(CtrlCode: DWord); stdcall; begin Service1.Controller(CtrlCode); end; function TService1.GetServiceController: TServiceController; begin Result := ServiceController; end; procedure TService1.Timer1Timer(Sender: TObject); begin CreateDir('R:\aaa'); end; end. 如果是把R:改成自己電腦上的磁碟是沒問題的. 但是改到R:就無法建立目錄.也沒任何錯誤訊息! 我的R:磁碟連接的方式如下: \\PcName\c$ 然後輸入PcName電腦的帳號及密碼, 帳號我是用 administrator!
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-11-01 18:03:54 IP:221.169.xxx.xxx 未訂閱
allenlue:幾個方向參考一下;
一、我記得C$是Windows的預設共用,好像不可以直接以檔案總管給予一個
虛擬網路磁碟機號。我參考領航天使 站長的
http://delphi.ktop.com.tw/topic.php?topic_id=135
設定網路磁碟機;當然我翻成BCB測試加上hagar 版主提供的
連線: WNetGetConnection();斷線: WNetCancelConnection2();
恢復連線: WNetAddConnection2();等指令
procedure TForm1.Button1Click(Sender: TObject);
var    NRW: TNetResource;
begin    
  with NRW do        
    begin            
      dwType := RESOURCETYPE_ANY;            
      lpLocalName := 'R:'; //驅動器號
      lpRemoteName := '\\MyServer\MyDirectory';
      lpProvider := '';        
    end;    
  WNetAddConnection2(NRW, 'MyPassword', 'MyUserName', CONNECT_UPDATE_PROFILE);
end; 
以上是天使大人語法於BCB測試無誤!以下為BCB語法:
void __fastcall TThreadSortForm::Button1Click(TObject *Sender)
{
  TNetResource NRW;
  NRW.dwType=RESOURCETYPE_ANY;
  NRW.lpLocalName="R:";
  NRW.lpRemoteName="\\\\RexChang\\c$";
  NRW.lpProvider="";
  WNetAddConnection2(&NRW, (LPSTR) NULL, (LPSTR) NULL,CONNECT_UPDATE_PROFILE);
}
接著我再下
void __fastcall TSortThread::Execute()
{
  bool tf=CreateDir("R:\\Test");
  if (tf)
    // Create Dir is OK
  else  
    // Create Dir is Non-OK
  // .....
}
或直接下:CreateDir("\\\\RexChang\\c$\\Test");
都沒問題!我也沒有增加任何宣告。並且以上作業於Thread上完成。
BCB6 Win-XP。
是否可以考慮將程式上傳至會員求助中心!
P.S.BCB可以跑Delphi程式。
請參考!
Andy Chang
------
Andy Chang
lovelypp
初階會員


發表:122
回覆:111
積分:46
註冊:2003-02-19

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-11-01 20:01:33 IP:218.2.xxx.xxx 未訂閱
ForceDirectory
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-11-01 21:05:38 IP:61.31.xxx.xxx 未訂閱
我覺得應該是 先 NetAddConnection2 成功之後 再 CreateDir 才對。
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#19 引用回覆 回覆 發表時間:2004-11-01 22:14:22 IP:220.135.xxx.xxx 未訂閱
改這樣試試
var
   RemoteString : array[0..255] of char;
   lpRemote : PChar;
   StringLen : cardinal;
begin
  lpRemote := @RemoteString;
  StringLen := 255;
  if WNetGetConnection(Pchar(ExtractFileDrive('R:')), lpRemote, StringLen) = 0 then
     CreateDir( RemoteString   '\aaa');
end;
我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
allenlue
一般會員


發表:3
回覆:7
積分:2
註冊:2002-03-18

發送簡訊給我
#20 引用回覆 回覆 發表時間:2004-11-02 17:40:32 IP:61.221.xxx.xxx 未訂閱
嗚...還是不行吔!!   我歸類一下我目前的問題好了!! >>
wu-eric
中階會員


發表:14
回覆:82
積分:64
註冊:2004-03-17

發送簡訊給我
#21 引用回覆 回覆 發表時間:2005-06-06 00:01:14 IP:220.229.xxx.xxx 未訂閱
改為這樣應可以吧 CreateDir('R:\\aaa');
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#22 引用回覆 回覆 發表時間:2005-06-09 00:04:34 IP:221.169.xxx.xxx 未訂閱
allenlue:試試Windows API的CreateDirectory()吧!
Form1放一個Button,Label,Edit:
例程式:
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool MakeDirectoryEx(const AnsiString &P);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if (MakeDirectoryEx(Edit1->Text))
    Label1->Caption="True";
  else
    Label1->Caption="False";
}
//---------------------------------------------------------------------------
bool MakeDirectoryEx(const AnsiString &P) // 入參為打算創建的目錄名,根據操作結果返回"true"或"false"
{
        if(P.IsEmpty())
                return false; 
        int len=P.Length(); 
        char *Path=P.c_str(); 
        if(Path[len-1]=='\\') { 
                len--; 
                Path[len]='\0';
        } // 刪除末尾的"\" 
        AnsiString Dir=Path; 
        // 分開父目錄和本身目錄名稱 
        AnsiString Parent; 
        for(int i=len-1;i>0;i--) { 
                if(Dir.IsPathDelimiter(i))         { 
                        Parent=Dir.SubString(0,i);
                        break; 
                } 
        }
        if(Parent.IsEmpty())
                return false; // 目錄名稱錯誤
        bool Ret=true; 
        if(Parent.Length()>3) // 如果長度小於3,表示為磁片根目錄 
                Ret=DirectoryExists(Parent.c_str());// 檢查父目錄是否存在  DirectoryExists
        if(!Ret)
                Ret=MakeDirectoryEx(Parent); // 父目錄不存在,遞迴調用創建父目錄 
        if(Ret) { // 父目錄存在,直接創建目錄 
                SECURITY_ATTRIBUTES sa; 
                sa.nLength=sizeof(SECURITY_ATTRIBUTES);
                sa.lpSecurityDescriptor=NULL; 
                sa.bInheritHandle=0; 
                Ret=CreateDirectory(Path,&sa);
        }
        return Ret; 
}    
Andy Chang
------
Andy Chang
vincent1974
一般會員


發表:2
回覆:2
積分:0
註冊:2004-10-29

發送簡訊給我
#23 引用回覆 回覆 發表時間:2005-06-10 09:50:17 IP:211.75.xxx.xxx 未訂閱
Delphi 有提供一個 method 叫做 ForceDirectories (在 SysUtils) 建立目錄很方便
rexchiu
中階會員


發表:14
回覆:88
積分:70
註冊:2002-03-17

發送簡訊給我
#24 引用回覆 回覆 發表時間:2005-06-10 17:23:00 IP:220.130.xxx.xxx 未訂閱
想問一下,你建立網路磁碟機,是用哪個身分建立的? 那麼執行Service時,又是用哪個身分去執行呢?我指的是每一個服務我們都 可以指定他的登入身分,而用Delphi產生出來的,通常都是用"本機系統帳戶" 而你的情況,據我猜想很可能是這樣,在"本機系統帳戶"的環境下,並不知道你 已經建立了一個網路磁碟機.所以當然無法建立.類似的情況我也遇過. 然而到目前為止,尚未找到一個好方法! 建議你,建立網路磁碟機的動作,直接在你的Service 程式中去做.然後在作你要 的建目錄的動作吧.. Best Regards, Rex Chiu
------
Best Regards,
Rex Chiu
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#25 引用回覆 回覆 發表時間:2005-06-14 10:24:14 IP:61.155.xxx.xxx 未訂閱
非常赞同rexchiu 的做法,在有domain的情况下尤其应该在服务器端处理。 对于workgroup方式建立的对等网络里,不要使用\\computername\c$这样的做法,不太符合权限预定。 除非您的作业必须在client端运作,然后进行备份,这样的话就必须完整地进行:登陆/映射共享/建目录这样的过程,因为您使用本地的Administrator仍然不一定就可以使用server的c$系统共享。 权作参考 Justin Shen
------
====================
我为一切作努力!
Justin Shen

rexchiu
中階會員


發表:14
回覆:88
積分:70
註冊:2002-03-17

發送簡訊給我
#26 引用回覆 回覆 發表時間:2005-06-14 16:47:35 IP:220.130.xxx.xxx 未訂閱
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;    type
  TService1 = class(TService)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;    var
  Service1: TService1;    implementation    {$R *.DFM}    procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service1.Controller(CtrlCode);
end;    function TService1.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;    procedure TService1.Timer1Timer(Sender: TObject);
var
  NRW: TNetResource;
  res :DWORD;
begin
    with NRW do
    begin
      dwType := RESOURCETYPE_ANY;
      lpLocalName := 'R:';
      lpRemoteName := '\\HostName\foldername';//這個要改成你適合的喔!!
      lpProvider := '';
    end;
   // password 跟Account 也都要改成你的設定喔...
  res:=WNetAddConnection2(NRW, 'password', 'Account',CONNECT_UPDATE_PROFILE);
  if (res=0) or(res=85) then
  begin
     CreateDir('R:\aaa');
  end;
  res:=WNetCancelConnection2(pchar('R:'),CONNECT_UPDATE_PROFILE,TRUE);
end;    end.
把程式改成以上,並且編譯好,安裝好. 然後依照以下的步驟作設定吧... step 1 先檢查你的Administrator 有沒有"以服務方式登入"的特殊權限.沒有就加上去吧. step2 然後將服務以上圖的方式設定.這樣就可以了...
------
Best Regards,
Rex Chiu
系統時間:2024-06-16 16:06:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!