DOBON.NET DOBON.NETプログラミング掲示板過去ログ

StreamWriterで書き出したファイルの保存先

分類:[.NET]

こんにちは、はじめまして。
業務でVB.NETの勉強をしております曇り空と申します。

SQLサーバに保存されているデータを、StreamWriterを使ってCSVファイル形式で
書き出すコードを追加しました。
書き出し自体は問題なくおこなわれたのですが、この書き出しファイルの保存先を
変更する方法が分かりません。

現在、開発に使っている端末にSQLサーバも立てた状態で開発をおこなっています。
これを普通に実行すると、コード内で指定した場所に問題なく書き出される
のですが、他端末からネットワークを経由して実行すうと、書き出したファイルが
開発機のローカルに作成されるのです。
これをアクセスしてきた他端末のローカルに保存するための機能を探しています。

ヘルプやTipsなど、自分なりに調べてみたのですが、どうしても回避方法を
見つけきれませんでした。
ご存知の方がいらっしゃいましたら、アドバイスの方宜しくお願いします。
> SQLサーバに保存されているデータを、StreamWriterを使ってCSVファイル形式で
> 書き出すコードを追加しました。
> 書き出し自体は問題なくおこなわれたのですが、この書き出しファイルの保存先を
> 変更する方法が分かりません。

状況が見えませんが、どういう風にStreamWriterを使っているのでしょう?
StreamWriterのインスタンスを作成するときに、書き出し先ファイルのパス文字列、または、
書き出し先ファイルのパスを元に作成したFileStreamを利用していると思いますが、
この書き出し先ファイルのパスを希望のパスに指定すればよいだけでは?
>他端末からネットワークを経由して実行すうと、書き出したファイルが
> 開発機のローカルに作成されるのです。
> これをアクセスしてきた他端末のローカルに保存するための機能を探しています。

質問ですが、VB.NETのクライアント・サーバー型ですか、それともASP.NETの
WEBアプリですか?

もし、VB.NETで開発環境の実行ファイルを他の端末から実行(共有フォルダ内の
実行ファイルを実行)しているのであれば開発環境のマシンに作成されます。
また、WebアプリであればWebサーバーが動作しているマシン内に作成されます。
これは、実行ファイルの動いているマシン上に作成されるということです。

クライアント・サーバー型であれば内容を教えてほしいです。
以上です。
よねKENさん、fukuさん、レスありがとうございます。

> 質問ですが、VB.NETのクライアント・サーバー型ですか、それともASP.NETの
> WEBアプリですか?
 Webアプリになります。

> これは、実行ファイルの動いているマシン上に作成されるということです。
との事なので、やはり開発機にファイルが作成される機能のようですね…。

参考にならないかもしれませんが、現在使っているコードを以下に記述します。
アプリ実行先のパスなどが取れれば、他端末への保存もできるようになる
のでしょうか…?

-----[ここから]-----
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim MyConnection As New SqlConnection(MySQLConnStr)
        Dim TableName As String = "SERVER_M03"
        Dim ds As DataSet = New DataSet()
        Dim cnt As Integer
        Dim i As Integer

        'StreamWriterの初期化
        'ファイルを上書きし、Shift JISで書き込む
        Dim sw As New StreamWriter("c:\TestData.csv", False, System.Text.Encoding.GetEncoding(932))
        'レコードセットの内容をすべて書き込む
        Dim SQL As String = "SELECT AA,BB,CC,DD,EE,FF FROM " & TableName
        Dim MyCommand As New SqlDataAdapter(SQL, MyConnection)
        MyCommand.Fill(ds, TableName)

        cnt = ds.Tables(TableName).Rows.Count

        For i = 1 To cnt - 1
            sw.Write(ds.Tables(TableName).Rows(i).Item("AA"))
            sw.Write(Chr(44))    'カンマ区切り
            sw.Write(ds.Tables(TableName).Rows(i).Item("BB"))
            sw.Write(Chr(44))
            sw.Write(ds.Tables(TableName).Rows(i).Item("CC"))
            sw.Write(Chr(44))
            sw.Write(ds.Tables(TableName).Rows(i).Item("DD"))
            sw.Write(Chr(44))
            sw.Write(ds.Tables(TableName).Rows(i).Item("EE"))
            sw.Write(Chr(44))
            sw.Write(ds.Tables(TableName).Rows(i).Item("FF"))
            sw.Write(Chr(13))    '改行
        Next

        '閉じる
        sw.Close()

    End Sub
-----[ここまで]-----
> 他端末からネットワークを経由して実行すうと、書き出したファイルが
> 開発機のローカルに作成されるのです。
> これをアクセスしてきた他端末のローカルに保存するための機能を探しています。

最初の投稿に上記の文があったので、てっきりC/S型だと思いました。
Webアプリとのことなので、
「他端末からネットワークを経由して実行する」とおっしゃっているのは、
ブラウザ上に表示されたWebページのボタンをクリックする、ということだったのですね?

Webアプリでサーバからクライアントマシンに保存するという無茶はできません。
C/S型のシステムを開発する感覚は捨てましょう。

StreamWriterでファイルに書き出すのではなく、
ヘッダーを適切に設定して、Reponseオブジェクトに対する出力としてCSVを出力し、
ダウンロードダイアログが表示され、ユーザが指定するファイルのパスで保存するという形になります。

ちらっと検索したら、ずばりな内容がありました。
「ASP.NETでCSVのファイルを生成してダウンロードするには?」
http://www.ailight.jp/ASPDownload.aspx
よねKENさん、レスありがとうございます。

> 「他端末からネットワークを経由して実行する」とおっしゃっているのは、
> ブラウザ上に表示されたWebページのボタンをクリックする、ということだったのですね?
その通りです。
説明が悪くて申し訳ありません。

リンク頂いたページを読んでみました。
早速、VB仕様に書き換える所から取り組んでみますね。
ありがとうございます、また報告にあがります。

DOBON.NET | プログラミング道 | プログラミング掲示板