- PR -

SharePointの物理パスを取得したい

投稿者投稿内容
エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2009-01-07 16:42
開発環境

SharePointのバージョン:
Windows SharePoint Service 3.0(テスト環境)
Microsoft Office SharePoint Server 2007(本番環境)

開発環境:
Microsoft Visual Studio 2005 Tools for Applications(以下VSTA)
Microsoft Office InfoPath 2007のカスタムインストールでインストールされます。

OS:
Microsoft Windows XP Professional Version 2002 Service Pack 2


質問内容

SharePointのドキュメントライブラリに保存してあるエクセルファイルの存在チェック、及び現在開かれているかどうかのチェックを行いたいのですが
ドキュメントライブラリ上のURLはわかるものの、物理パスがわからず存在チェックが行えません


上記問題に対して

1.相対パスから物理パスを取得する(Server.MapPathを使用する)
2.SharePoint作成時に一定の法則で物理パスが構成されているのじゃないか?と考え
  物理ファイルの存在場所を探った

と言う方法を取りました

まず、2の方からですが、これは私でなく上司が手隙に簡単に調べただけですが、見つける事が出来ませんでした

上司も多忙であるため深く探ってはもらい辛く
私自身がSharePointが構築してあるPCを触る事が出来ないため、保留してあります



そして、私自身で確認が行える1の方法なのですが
(できればこれがベストと考える)

まず、ASP.NETでない為 Server.MapPathがそのままでは
Serverの部分が宣言されていないと言うエラーになり

Serverオブジェクトの取得をしようと考えました

System.Web.HttpContext.Current.Serverから取得しようとすると
CurrentがNothingで返ってき


Dim objService As System.Web.Services.WebService = New System.Web.Services.WebService

と言う風に無理やりNewし

Dim strPath As String = objService.Server.MapPath(URL)
とすると

『HttpContextを使用できません。このクラスはASP.NET要求のコンテキストでのみ使用できます。』

と言ったエラーメッセーが表示されました


最初はVSTAと言う環境で使用するクラスを参照の追加を行わないと使用できなかったりと言う事が有ったので、何かを参照すればServerが使用できると考えていたのですが、上記エラーメッセージによりServer.MapPathはASP.NETでしか使用できないのかと考えが出てきました

そもそも、空のWebServicesを作った所で無意味だとは思いますが・・・
エラー内容がそういった内容だったのでそうなのかなと



ただ、通常のVisual Studio 2005で開発するウィンドウズアプリケーションの場合も、それで言うとServer.MapPathを使用出来ないと言う事になるかとおもいますが、それも使い勝手が悪いし何かしら方法が有るんじゃないかと考え質問させて頂いた次第です


現状Visual Studio 2005(VSTA以外の.NET環境)が使用出来ず
Visual Studio 2005ではどうなのかと言う検証が自分ではできてないのですが

VSTAも参照さえ追加すれば、Visual Studio 2005とほぼ同等のコードを組めると考えています
ですので、VSTAに限らず、Visual Studio 2005の場合でも構わないので何かアドバイスをいただけたら助かります


以上、よろしくお願いいたします
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2009-01-07 18:28
Windows Internal Database または SQLServer 内に格納されている筈です。

http://technet.microsoft.com/ja-jp/library/cc288005.aspx

チェックアウトなどの機能があるのに、普通の NTFS 上に置くわけがないかと。
SharePoint の API 使ってアクセスするべきでしょう。


引用:

エイジさんの書き込み (2009-01-07 16:42) より:
開発環境

SharePointのバージョン:
Windows SharePoint Service 3.0(テスト環境)
Microsoft Office SharePoint Server 2007(本番環境)

開発環境:
Microsoft Visual Studio 2005 Tools for Applications(以下VSTA)
Microsoft Office InfoPath 2007のカスタムインストールでインストールされます。

OS:
Microsoft Windows XP Professional Version 2002 Service Pack 2


質問内容

SharePointのドキュメントライブラリに保存してあるエクセルファイルの存在チェック、及び現在開かれているかどうかのチェックを行いたいのですが
ドキュメントライブラリ上のURLはわかるものの、物理パスがわからず存在チェックが行えません


上記問題に対して

1.相対パスから物理パスを取得する(Server.MapPathを使用する)
2.SharePoint作成時に一定の法則で物理パスが構成されているのじゃないか?と考え
  物理ファイルの存在場所を探った

と言う方法を取りました

まず、2の方からですが、これは私でなく上司が手隙に簡単に調べただけですが、見つける事が出来ませんでした

上司も多忙であるため深く探ってはもらい辛く
私自身がSharePointが構築してあるPCを触る事が出来ないため、保留してあります



そして、私自身で確認が行える1の方法なのですが
(できればこれがベストと考える)

まず、ASP.NETでない為 Server.MapPathがそのままでは
Serverの部分が宣言されていないと言うエラーになり

Serverオブジェクトの取得をしようと考えました

System.Web.HttpContext.Current.Serverから取得しようとすると
CurrentがNothingで返ってき


Dim objService As System.Web.Services.WebService = New System.Web.Services.WebService

と言う風に無理やりNewし

Dim strPath As String = objService.Server.MapPath(URL)
とすると

『HttpContextを使用できません。このクラスはASP.NET要求のコンテキストでのみ使用できます。』

と言ったエラーメッセーが表示されました


最初はVSTAと言う環境で使用するクラスを参照の追加を行わないと使用できなかったりと言う事が有ったので、何かを参照すればServerが使用できると考えていたのですが、上記エラーメッセージによりServer.MapPathはASP.NETでしか使用できないのかと考えが出てきました

そもそも、空のWebServicesを作った所で無意味だとは思いますが・・・
エラー内容がそういった内容だったのでそうなのかなと



ただ、通常のVisual Studio 2005で開発するウィンドウズアプリケーションの場合も、それで言うとServer.MapPathを使用出来ないと言う事になるかとおもいますが、それも使い勝手が悪いし何かしら方法が有るんじゃないかと考え質問させて頂いた次第です


現状Visual Studio 2005(VSTA以外の.NET環境)が使用出来ず
Visual Studio 2005ではどうなのかと言う検証が自分ではできてないのですが

VSTAも参照さえ追加すれば、Visual Studio 2005とほぼ同等のコードを組めると考えています
ですので、VSTAに限らず、Visual Studio 2005の場合でも構わないので何かアドバイスをいただけたら助かります


以上、よろしくお願いいたします

かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2009-01-08 00:20
引用:

エイジさんの書き込み (2009-01-07 16:42) より:

System.Web.HttpContext.Current.Serverから取得しようとすると
CurrentがNothingで返ってき


ちょっと調べてないけれど、これはおかしい。
なんか web.config の設定がおかしかったり、
ページの変なイベントのタイミングで参照しようとしてたりしませんか?
_________________
かるあ のメモスニペット
エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2009-01-08 08:43
まるくさん

未熟者のためイメージでしかおっしゃる意味をつかめていないのですが
チェックアウト機能を持つVSSから想像するに、ファイルのデータはExcelファイルでも.xlsで保存されず別の形で保存され、DB上からアクセスすると言う型で考えるとよいのでしょうか

SharePointのAPIと言うのも、まだ全然把握できていませんので調べてみようと思います

ありがとうございました
エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2009-01-08 09:07
かるあさん

そもそもweb.configが存在せず、app.configなら後から追加することが出来るのですが
VSTAではなく、通常のVS2005ではウィンドウズアプリケーションでもweb.configが追加出来るものなのでしょうか?

タイミングは
SharePointサイトに発行してあるInfoPathフォームが開かれ、ユーザーのボタンクリックのイベントで行っています
その際、ASP.NETとは違い処理をローカルPC上で行っていると思われるのでcurrentがNothingになるのだとは思います


SharePointサイト(サーバー側)に置かれたInfoPathフォームを開き、VSTAのロジックをダウンロード、ローカルPC上の.net Framework環境で実行される
と言う流れなのではないかと考えます

上記は、MessageBoxなどのクラスを使用可能な事からの推測で、確証があるわけではありませんが・・・


InfoPathの機能にブラウザ互換の機能があり、組んだコードをASP.NETに変換してくれる
と言う物が搭載されているようなのですが、今回のシステム上それを行うと今度は
検索画面実装のために追加したWindows フォーム等が使えなくなるのじゃないかと考えます


以上で何か間違った理解している部分などありましたら、またアドバイスいただけると助かります


なかなか確証の持てる資料を見つける事が出来ず、またそれを深く探るのに時間をあてることも出来ない状況で開発を行っているため、経験と推測からのお答になってしまいました

確証の持てない返答で申し訳ありません・・・
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2009-01-08 10:27
引用:

チェックアウト機能を持つVSSから想像するに、ファイルのデータはExcelファイルでも.xlsで保存されず別の形で保存され、DB上からアクセスすると言う型で考えるとよいのでしょうか


↑だと思いますね。

引用:

そもそもweb.configが存在せず、app.configなら後から追加することが出来るのですが
VSTAではなく、通常のVS2005ではウィンドウズアプリケーションでもweb.configが追加出来るものなのでしょうか?


もしかして、Windows アプリから Server オブジェクトを使おうとしているのですか?
それは無理でしょう。IIS 経由で呼び出されないと。。。

---

あと、一応 SharePoint の API についてリンクを貼っておきます。

[参考1] SharePoint の API 利用について(Microsoft.SharePoint.dllの参照)
http://msdn.microsoft.com/ja-jp/library/ms479423.aspx

[参考2] チェックアウト状態を取得したい場合
http://msdn.microsoft.com/ja-jp/library/microsoft.sharepoint.spfile.checkoutstatus.aspx

---

私は VSTA 知識無しですが、InfoPath フォームはサーバ側で動作する事から、InfoPath フォームから API 使えば良いと思うんですけど。
Microsoft.SharePoint.dll は、WSS/MOSS インストール環境に存在しますので、VSTA で開発する際に、恐らく Microsoft.SharePoint.dll を開発環境にコピーするなりしないといけないでしょうね。
サーバ上に開発ツールをインストールしてしまうのが手っ取り早いです。
エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2009-01-08 11:31
まるくさん

やはりIIS経由でないとServerオブジェクトは使用できないんですね・・・

InfoPathはサーバーに発行してるものの、実際のコード部分はローカル上で実行されているんじゃないかと考えます

理由は先にかるあさんへの返信で述べたのに加え

ローカルPCに.net Framework2.0がインストールされていないと実行できない
ローカルPCにMicrosofot Officeインストール時に
InfoPath .NET プログラミングサポートの、.NET Framework Version 2.0 用 .NET プログラミング サポート
をインストールされていないと実行できない

と言う点があるからです


コードの実行に関してローカルPCの環境に依存している為、InfoPathのデザイン(フォーム)はサーバー上に有るが、コードの実行はローカルPC上で行われていると考え至ったしだいです

それで言うとMicrosoft.SharePoint.dllも、各エンドユーザー端末に配布しないといけないのではないかと考えるのですが、そこに至ると私の判断では行動できないので、上司も含め検討してみたいと思います

今回のシステムの為にエンドユーザーにすでにインストール済みのInfoPathに加え、上記の.net Framework2.0やプログラミングサポートを追加インストールする事になっていますので、その時に配布できればそれも可能かもしれません
(ライセンスの問題はまた調べて見ます)

SharePointのAPIには
SPFileクラスなどSharePoint側で使いやすそうな物が提供されている様なので、これを利用する事になれば、更に踏み込んだ開発が行えそうです

参考のURLまでいただきありがとうございました



2009/01/08 11:35 追記

下記URLにてMicrosoft.SharePoint.dllの参照方法が書かれていました
http://forums.microsoft.com/msdn-ja/showpost.aspx?postid=2417114&siteid=7

その中に「MOSSサーバーの該当フォルダを参照して直接設定する」と言う手法も書かれていたので、それも踏まえ検討してみたいと思います


[ メッセージ編集済み 編集者: エイジ 編集日時 2009-01-08 11:37 ]
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2009-01-08 11:53
SharePoint の物理パスの取得は、こんな感じでできたと思います。(たぶん)
昔書いたコードなので具体的に何やっているかはうろ覚えですが…。
(なぜか TryGetValue メソッド使ってますが、そのまま載せてておきます。不要かもしれません。)

コード:
SPSite targetSite = new SPSite(rootUrl);

SPWebApplication webApplication = targetSite.WebApplication;
Dictionary<SPUrlZone, SPIisSettings> dictionaryData = webApplication.IisSettings;

SPIisSettings iisSettings;
dictionaryData.TryGetValue(targetSite.Zone, out iisSettings);

string path = iisSettings.Path.ToString();



InfoPath 側 (というか SharePoint の稼働 PC 以外の PC 上) では正常に動作しないかもしれません。
その場合は、カスタム Web サービスを作って SharePoint 上に配置する必要があるかもしれません。


SPIisSettings.Path プロパティ (Microsoft.SharePoint.Administration)

_________________
C#と諸々

[ メッセージ編集済み 編集者: よこけん 編集日時 2009-01-08 11:56 ]

スキルアップ/キャリアアップ(JOB@IT)