WebDAV上のファイル・フォルダを取得したい


ウォレス  2021-01-15 14:38:45  No: 149546

標記の件、Sharepoint上といったらいいのか、WebDAVといったらいいのか正確な表現がわかりませんが、

https://**** の場所(SharePoint上)にある ファイル/フォルダを操作したいのです。

uses
  System.Types, IOUtils, Vcl.StdCtrls;

var
  Path: String;
  FolderList: TStringDynArray;
  FolderName: String;

begin
   Path := 'https://****.sharepoint.com/*****************'; //ここはすみません。伏字になります・・・・

    FolderList := TDirectory.GetDirectories(Path, '*', TSearchOption.soTopDirectoryOnly);
    for FolderName in FolderList do
    begin
      memo1.Lines.Add(FolderName);
    end;
end;

といった感じでは「パスの形式がサポートされていません」エラーが出ます。
レベルの低い質問ですがご教示ください。
宜しくお願いします。


HFUKUSHI  2021-01-15 16:17:33  No: 149547

全く詳しくないのですが、WebDAVはwebというくらいで、ローカルと同じ方法ではアクセスできません。
ちょろっと検索してみた範囲では、
(1) TIdHttpなどでHTTPでアクセス
(2) WNetAddConnection2を使う
のどっちかのようです。(2)は例えばSOにこんな質問があがっています(XPはだめだけど7はOK、という内容のようですが参考にはなるかと)。
delphi - Mapping a network drive (WebDAV) doesn't work with Windows XP - Stack Overflow
https://stackoverflow.com/questions/11178480/mapping-a-network-drive-webdav-doesnt-work-with-windows-xp


ウォレス  2021-01-15 16:52:09  No: 149548

HFUKUSHI さん、ありがとうございます。ネットワークドライブの割り当てを行えば、一時的に普通のドライブのように扱えるのですが、SharePointは割と不安定で、すぐにドライブ認証が外れてしまったりするのです。(セッションが時間で切れるような感じです)
アクセス前にネットワークドライブが使えるのか、使えないなら再度割り当てを行う というような方法で対処できるかトライします。
ご回答ありがとうございました。
※ Indyに IdWebDav っていうのがるのでどうにかできないものか色々探してはみましたが、ファイルを読み書きするような仕組みはわかりませんでした。。。


Mr.XRAY  2021-01-15 23:16:02  No: 149549

> SharePointは割と不安定で、

『SharePointは、Microsoft365、及びOffice365で提供されるサービスの一つで、
ファイル共有・情報共有を目的とした企業向けサービスの名称です。』

なんですね.
もしかしたら,delphi SharePoint のキーワードで検索すると何か情報が・・・
誤解していたらゴメンナサイ.


mam  2021-01-18 21:40:07  No: 149555

FormにTIdWebDAV、TButton、TMemoをドラッグドロップして、以下のソースコードで、
ローカルのApacheのWebDavにはファイルをアップロードできました。
正直、よくわかっていないのですが、ご参考まで。

procedure TForm1.Button1Click(Sender: TObject);
var
    res: TStringStream;
    strm:TMemoryStream;
    b:TBytes;
begin
  strm:=TMemoryStream.Create;

  //UTF8文字列をWebDavにPUTする場合
  b:=TEncoding.UTF8.GetBytes('UTF8の文字列を入れます'+#13#10+'2行目'+#13#10);
  strm.Write(b,length(b));

  //ファイルをWebDavにPUTする場合
  //strm.LoadFromFile('a.jpg');

  res := TStringStream.Create('');
  try
    //fill params

    IdWebDAV1.URL.Username := 'user';
    IdWebDAV1.URL.Password := 'pass';
    IdWebDAV1.URL.Port := '80';
    IdWebDAV1.URL.URI := '/dav/';
    IdWebDAV1.URL.Host := 'localhost';
    IdWebDAV1.URL.Protocol := 'PROPFIND';

    //テキストファイルをアップロードする
    IdWebDAV1.Put('http://localhost/dav/a.txt', strm, res);
    //JPGファイルをアップロードする
    //IdWebDAV1.Put('http://localhost/dav/a.jpg', strm, res);
    //レスポンスを表示する場合
    Memo1.Lines.Text := res.DataString;
  finally
    strm.Free;
    res.Free;
  end;
end;


mam  2021-01-19 20:12:25  No: 149558

FormにTIdWebDAV、TButton、TMemoをドラッグドロップして、以下のソースコードで、
ローカルのApacheのWebDavだと、ファイル一覧(ファイル名、サイズ、最終更新日時等の属性)をXMLで取得できました。

procedure TForm1.Button3Click(Sender: TObject);
var res,req: TStringStream;
begin
    IdWebDAV1.Request.BasicAuthentication:=true;
    IdWebDAV1.URL.Username := 'user';
    IdWebDAV1.URL.Password := 'pass';
    res := TStringStream.Create('');
    IdWebDAV1.DAVPropFind('http://localhost/dav/',nil,res,'1',-1,-1);
    //レスポンスを表示
    Memo1.Lines.Text := res.DataString;
    res.Free;
end;


ウォレス  2021-01-21 10:11:56  No: 149567

mamさん、ありがとうございます。
特に2度目の回答、これがアクセスできたらすごくうれしいので今から試します。


ウォレス  2021-01-21 10:19:02  No: 149568

Mr.XRAY さん、ご返答ありがとうございます。
うちの会社はコロナのせいか、Teamsの導入が一気に進み、あらゆる情報がTemas上(SharePoint上)での管理に移行しているんです。
かなり便利ですが、反面、SharePoint上のファイルへのアクセス利便性が今一つです。
SharePointはエクスプローラで表示させて、あたかもドライブやサブフォルダのように使えますが、しばらくすると認証を忘れてしまいます。(自動で再認証手続きに入ってくれないため、結局フォルダのように使えない)
MicrosoftのアプリなのでOSに有機統合してくれたら何も考えなくて済むようになるかもしれません。


ウォレス  2021-01-21 10:40:25  No: 149569

mamさんに提示していただいた方法でトライしていますが今のところ成功しません
http://www.rei.to/carotdav.html
carotdav でも認証が通らないので、おそらく認証の肝心なところが理解できていないと思います(汗
ネットワークショートカットやネットワークドライブ割り当てはできるのになぁ・・・・


mam  2021-01-21 11:07:01  No: 149570

ごめんなさい、ご参考までですが、基本認証の場合は以下のようです。

procedure TForm1.Button3Click(Sender: TObject);
var res: TStringStream;
begin
    IdWebDAV1.Request.BasicAuthentication:=true;
    IdWebDAV1.Request.Username := 'user';
    IdWebDAV1.Request.Password := 'pass';
    res := TStringStream.Create('');
    IdWebDAV1.DAVPropFind('http://localhost/dav/',nil,res,'1',-1,-1);
    //レスポンスを表示
    Memo1.Lines.Text := res.DataString;
    res.Free;
end;


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加