C#でリンク先の画像を自動保存する方法

このQ&Aのポイント
  • C#でリンク先の画像を自動保存する方法について教えてください。
  • 質問者はC、C++について勉強しており、C#を使用してリンク先の画像を自動保存したいと考えています。
  • 具体的な要件は、連番のURL先の画像を自動的に保存することです。開始値と終了値を指定して、連番のURLにアクセスして画像を保存します。
回答を見る
  • ベストアンサー

C#で、リンク先の画像自動保存を実現させたい

こんにちは 僕はC、C++をある程度勉強しているのですが、タイトルのようにリンク先の画像保存を行うには、C#が一番のようなので、必死に手さぐりでコードを書いています。 実現したい内容は、連番のURL先の画像を自動保存する、というプログラムです。 http://001.jpg http://002.jpg http://003.jpg . . . といったURLを、基本のURL、桁数、開始値、終了値を入力し、自動的にアクセス、保存させたいわけです。 こちらがコードになります。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace aaa { class Program { static void Main(string[] args) { string s; string url = System.Console.ReadLine(); Console.WriteLine("書式"); string frm = Console.ReadLine(); Console.Write("開始値;"); int start = int.Parse(Console.ReadLine()); Console.Write("終了値;"); int end = int.Parse(Console.ReadLine()); for (int i = start; i <= end; i++) { s = i.ToString(); System.Net.WebClient wc = new System.Net.WebClient(); wc.DownloadFile(url.Replace(url, i.ToString(frm)), @"【ここには保存させたいフォルダのパスを入れます】" + s + ".jpg"); wc.Dispose(); Console.WriteLine(url, i.ToString(frm)); } } } } 例のURLを使うなら、入力は http://{0}.jpg 0 1 10(仮) です。 これで動くように作ったつもりなんですが、終了値入力終了後、エラーが出てきてしまいます。 コンパイラ側で 「WebExceptionはハンドルされませんでした」 「ファイル`C:\Users\【僕のユーザー名】\AppData\Local\Temporary Projects\Project\bin\Debug\1'が見つかりませんでした」 というものです。 どうかC#に慣れている方ご教授ください。 当方は、プログラミングの基礎知識はありますが、素人で、かつC#に関する知識はほぼゼロです。 メソッドやクラス等の書式も根本的に勘違いしている可能性もあります。すみません。 出来れば、具体的な改善ソースを掲示して頂くか、分かりやすく噛み砕いた説明の方をお願いしたいです。

noname#244325
noname#244325

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

for (int i = start; i <= end; i++) { s = i.ToString(); // System.Net.WebClient wc = new System.Net.WebClient(); // wc.DownloadFile(url.Replace(url, i.ToString(frm)), @"【ここには保存させたいフォルダのパスを入れます】" + s + ".jpg"); Console.WriteLine(url.Replace(url, i.ToString(frm))); Console.WriteLine(@"【ここには保存させたいフォルダのパスを入れます】" + s + ".jpg"); // wc.Dispose();// wc.Dispose(); // Console.WriteLine(url, i.ToString(frm)); } と、forの中をコメントアウトし、wc.DownloadFileに渡される引数をWriteLineしてみてください あなたが期待するのは 連番のURL 保存先ファイル名 だと思いますが、そうはならないはずです。 > 僕はC、C++をある程度勉強しているのですが、タイトルのようにリンク先の画像保存を行うには、C#が一番のようなので、必死に手さぐりでコードを書いています。 おそらく一番簡単なのは、連番ダウンロードが可能なアプリを使うことです。 コマンドラインで実行できるものもあります。 次は、連番URLを出力する簡単なプログラム + URL一覧からダウンロードできるアプリ C,C++,C#どれでもできるけど、Perl,Ruby,PHP,Python 等のスクリプトの方がコンパイル不要で便利

noname#244325
質問者

お礼

引数を確認してみたところ、確かにおかしかったです。 それぞれのメソッドの機能もまともに理解出来てないので、やはり既存のアプリを使うことにします。 ありがとうございました。

その他の回答 (1)

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.1

言語の知識も大事ですが、それよりもまずデバッグの技術を身につけましょう。 時間と労力の節約になります。 関数を呼び出してエラーが出てしまう場合、 まず関数に渡しているデータがおかしくないかをチェックしてください。 WebClient.DownloadFileメソッドにどういうデータを渡しているか、 コンソールに出力してみましょう。 for (int i = start; i <= end; i++) { s = i.ToString(); System.Net.WebClient wc = new System.Net.WebClient(); /**引数を見てみる**/ Console.WriteLine("Downloading from " + url.Replace(url, i.ToString(frm))); /******************/ wc.DownloadFile(url.Replace(url, i.ToString(frm)), @"【ここには保存させたいフォルダのパスを入れます】" + s + ".jpg"); wc.Dispose(); Console.WriteLine(url, i.ToString(frm)); } } } }

関連するQ&A

  • C#でカレンダーを作っているのですがここから先がわかりません。どなたかおしえてもらえませんか?

    using System; using System.Collections.Generic; using System.Text; namespace 万年カレンダー { class MyEventCiass { static void Main(string[] args) { int nen, tuki,tukinohi,youbi;    //西暦の入力 System.Console.Out.WriteLine("西暦を入力してください。"); nen = int.Parse(Console.ReadLine()); //月の入力 System.Console.Out.WriteLine("月を入力してください。"); tuki = int.Parse(Console.ReadLine()); //西暦と月の出力 Console.WriteLine(nen + "年" + tuki + "月"); switch (tuki) { case 2: if (nen % 4 == 0 && (nen % 100 != 0 || nen % 400 == 0)) tukinohi = 29; else tukinohi = 28; break; case 4: case 6: case 9: case 11: tukinohi = 30; break; default: tukinohi = 31; break; } if (tuki == 1 || tuki == 2) { nen = nen -1 ; tuki = tuki + 12; } //曜日の出力 Console.WriteLine("日 月 火 水 木 金 土"); youbi = (nen + nen / 4 - nen / 100 + nen / 400 + (13 * tuki + 8) / 5 + 1) % 7; if (youbi == 0) youbi = 7; for (int i = 1; i <= youbi ;i += 1 ) { Console.Write(i.ToString()); } for (int i = 4; i <= tukinohi; i += 1) { Console.Write(i.ToString()); } Console.ReadLine(); } } }

  • C#について

    using System; class AddressBook: PhoneBook { private string address; public AddressBook() : base() { address=""; } public void Input() { base.Input(); Console.Write("住所?"); string address=Console.ReadLine(); } public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } } class kadai62 { public static void Main() { Console.Write("電話帳に入力する人数を入れてください:"); int n = int.Parse(Console.ReadLine()); AddressBook[] pb = new AddressBook[n]; int i; for (i = 0; i < pb.Length; i++) { pb[i] = new AddressBook(); Console.WriteLine("{0}番目を入力してください.", i+1); pb[i].Input(); } Console.WriteLine(); while(true) { Console.Write("どこから探しますか?[1:氏名,2:自宅電話,3:携帯電話,0:終了] "); int t = int.Parse(Console.ReadLine()); if (t == 0) break; Console.Write("探す文字列は?"); string s = Console.ReadLine(); for (i = 0; i < pb.Length; i++) { if (pb[i].Search(t, s)) pb[i].Writes(); } } } } このプログラムで public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } のaddressが出力されません・・どうすれば 出力されますか?

  • [C#]順序通りに実行されない

    次のC#のプログラムについて質問です。 //ここから using System; class Myclass { double[] point; string[] name; int nMax; public double this[string str] { get { for (int i = 0; i < nMax; i++) { if (str == name[i]) return point[i]; } return -1.0; } set { for (int i = 0; i < nMax; i++) { if (str == name[i]) { point[i] = value; break; } } } } public Myclass(int n) { point = new double[n]; name = new string[n]; nMax = n; setname(); } void setname() { for(int i=0;i<nMax;i++) { Console.Write("生徒名[{0}] = ",i); name[i] = Console.ReadLine(); } } } class ch08ex02 { public static void Main() { Console.WriteLine( "まずはじめに生徒数と、全員の名前入力が必要です"); Console.Write("生徒数--- "); string strn = Console.ReadLine(); Myclass mc = new Myclass(int.Parse(strn)); string ans, strp; Console.WriteLine("X入力で終了"); while (true) { Console.Write("点数を入力したい生徒名--- "); if ((ans = Console.ReadLine()) == "X") break; Console.Write("点数--- "); strp = Console.ReadLine(); mc[ans] = double.Parse(strp); } Console.WriteLine(); Console.WriteLine("X入力で終了"); while (true) { Console.Write("点数を知りたい生徒名--- "); ans = Console.ReadLine(); if (ans == "X") break; Console.WriteLine("{0}くんの点数は{1}点です", ans, mc[ans]); } } } //ここまで これはプロパティを使って生徒の点数を配列に格納したり参照したりするプログラムですが、実行するとMain()の    Console.Write("生徒数--- "); string strn = Console.ReadLine(); Myclass mc = new Myclass(int.Parse(strn)); string ans, strp; Console.WriteLine("X入力で終了");    while (true) { Console.Write("点数を入力したい生徒名--- "); if ((ans = Console.ReadLine()) == "X") break; Console.Write("点数--- "); strp = Console.ReadLine(); mc[ans] = double.Parse(strp); } の部分が思い通りに動いてくれません。 まずコンソールに「生徒数--- 」と表示されConsole.ReadLine()で数字を受け取り、その数からMyclassのインスタンスを作成し、「X入力で終了」と表示した後whileループで生徒名と点数の入力を受け付けるはずです。 しかしこれを実行すると「X入力で終了」と表示する前にwhileループに入り、ループを抜けた後「X入力で終了」と表示されます。 つまり順番が逆になっているわけです。 なぜこうなるかわかりません。 誰か教えてください、お願いします。

  • C# 猫でもわかる・・・ のプログラムで質問です。

    猫でもわかる・・・のページでC#の勉強させてもらってるのですが、 解らないところが出たので教えてください。 using System; class dowhle01 { public static void Main() { Console.Write("数字を入力してください(1-9) --- "); string strInput = Console.ReadLine(); if (strInput.Length >= 2) return; if (!char.IsDigit(strInput[0]) || strInput[0] == '0') return; int n = strInput[0] - '0'; string mystr = ""; int i = 1, sum = 0; do { sum += i; mystr += string.Format("{0} + ", i); i++; } while (i <= n); char[] trimchar = new char[] { '+', ' ' }; mystr = mystr.TrimEnd(trimchar); mystr += " = "; mystr += sum; Console.WriteLine(mystr); } } このプログラムの中の int n = strInput[0] - '0'; この部分なんですけど、 これはint型に直してるってことでしょうか? でも、普通int型にするなら、 int n = int.Parse(strInput);ですよね? こういうやり方もあるって意味なんですかね? それとも、何か特別な意味があるのでしょうか? 教えて下さい。よろしくお願いします。

  • C++ ファイル列挙について

    以下のコードで指定のファイルを検索し、フルパスで配列に格納しています。 このとき、ファイル名のみ(パスと拡張子無し)で格納する方法はありますでしょうか。 どうかよろしくお願いします。 // enum_files.cpp // compile with: /clr using namespace System; using namespace System::IO; int main() { String^ folder = "C:\\"; array<String^>^ dir = Directory::GetDirectories( folder ); Console::WriteLine("--== Directories inside '{0}' ==--", folder); for (int i=0; i<dir->Length; i++) Console::WriteLine(dir[i]); array<String^>^ file = Directory::GetFiles( folder ); Console::WriteLine("--== Files inside '{0}' ==--", folder); for (int i=0; i<file->Length; i++) Console::WriteLine(file[i]); return 0; }

  • C# String.IndexOfのバグですか?

    C# String.IndexOfのバグですか? 非常に単純なコード String s = ",a,b,c,d,e"; int left; left = s.IndexOf(',', 0, 1); Console.WriteLine(left.ToString ()); left = s.IndexOf(',', 0, 2); Console.WriteLine(left.ToString()); left = s.IndexOf(',', 1, 1); Console.WriteLine(left.ToString()); left = s.IndexOf(',', 1, 2); Console.WriteLine(left.ToString()); 結果: 0 0 -1 2 もしかして、バグですか???

  • C#でのcsv保存

    今,下記のようなプログラムを組んでいます.ですが,うまくdataGridviewのデータが保存されません.何がいけないのでしょうか?だれかご教授よろしくお願いいたします. int R,C; R = dataGridView1.RowCount - 1; C = dataGridView1.ColumnCount - 1; string[] cdata = new string[R]; //string Ter =Convert.ToString(R); //string Tec = Convert.ToString(C); //textBox1.Text = Ter; //textBox2.Text = Tec; for (int Gdata = 1; Gdata < R; Gdata++) { string c = Convert.ToString(dataGridView1.Rows[Gdata].Cells[0].Value); cdata[Gdata] = c; //saveFileDialog1.Filter = "csvファイル (*.csv)|*.csv"; //if (saveFileDialog1.ShowDialog() == DialogResult.OK) //{ // int cdata = Convert.ToInt16(c); // cdata.saveNewCSVdata(saveFileDialog1.FileName); //} } //SaveFileDialogクラスのインスタンスを作成 SaveFileDialog sfd = new SaveFileDialog(); //ダイアログを表示する if (sfd.ShowDialog() == DialogResult.OK) { //OKボタンがクリックされたとき //選択された名前で新しいファイルを作成し、 //読み書きアクセス許可でそのファイルを開く //既存のファイルが選択されたときはデータが消える恐れあり System.IO.Stream stream; stream = sfd.OpenFile(); if (stream != null) { //ファイルに書き込む System.IO.StreamWriter sw = new System.IO.StreamWriter(stream); sw.Write(cdata); //閉じる sw.Close(); stream.Close(); } }

  • WebClientの文字列送信にてエラー

    .net のWebClientを使用して文字列をアップロードしているのですが、上手くいかず以下のようなエラーが返されます。 エラー内容:「サーバーによってプロトコル違反が発生しました. Section=ResponseHeader Detail=ヘッダー名が無効です。」 [環境] VS2005 VB.NET [ロジック] Using wc As New System.Net.WebClient wc.Encoding = System.Text.Encoding.GetEncoding("shift_jis") wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded") wc.Credentials = New System.Net.NetworkCredential(user,pass) Dim url As New System.Uri("http://指定のURL") Dim returnvalue As String = wc.UploadString(url, "POST", "送信文字列") End Using 補足ですが、通信にはベーシック認証を使用していますが、ユーザー・パスは問題ありません。 UploadStringAsyncを使用すれば文字送信はできています。 通信結果をサーバーより取得するためUploadStringを使用しています。 どなたか解決策をご存知の方はご教授いただきたいと思います。 宜しくお願い致します。

  • どうして’)’や’;’が足りないの?

    いつも大変お世話になりありがとうございます。 色々と打ち直したりしているのですが、どうしても コンパイルエラーが出ます。 どうすればいいのでしょうか? C:\JAVA>javac Lesson10.java Lesson10.java:11: エラー: ';'がありません Console console = System console(); ^ Lesson10.java:12: エラー: ')'がありません input = Integer.parseInt(console readLine()); ^ Lesson10.java:12: エラー: ';'がありません input = Integer.parseInt(console readLine()); ^ エラー3個 import java.io.Console; public class Lesson10 { public static void main(String[] args) { final int answer = 3; int input; System.out.println("コンピュータが思い浮かべた数字を当ててね!"); System.out.println("「これだ!」と思う数を1~10までで入力しましょう"); Console console = System console(); input = Integer.parseInt(console readLine()); if (input == answer) { System.out.println("お見事、アタリです!"); }else{ System.out.println("残念、ハズレです!"); } } }

    • ベストアンサー
    • Java
  • C#で独自の型を定義したい

    C# 2010 version 4.0を使用しています。 次のようなint型とstring型を混合したMixedという型を定義したいのですが、 public class Mixed { private int _TheInt = 0; public int TheInt { get { return _TheInt; } set { _TheInt = value; } } private string _TheString = null; public string TheString { get { return _TheString; } set { _TheString = value; } } public static implicit operator int(Mixed m) { return m.TheInt; } public static implicit operator Mixed(int x) { Mixed m = new Mixed(); m.TheInt = x; return m; } public static implicit operator string(Mixed m) { return m.TheString; } public static implicit operator Mixed(string x) { Mixed m = new Mixed(); m.TheString = x; return m; } } //Mixed m = 1; //Console.WriteLine(m); //これだとコンパイルエラーになる //Console.WriteLine(m.TheInt.ToString()); //「1」と表示される int i = 1; Console.WriteLine(i); //「1」と表示される object o = 1; Console.WriteLine(o); //「1」と表示される Console.WriteLineなどで表示する場合に 例えばint型なら int i = 1; Console.WriteLine(i); //「1」と表示される という具合にそのまま「1」と表示されます。 でもこのMixedの場合、 Mixed m = 1; Console.WriteLine(m.TheInt.ToString()); //「1」と表示される これでは「1」と表示されるのですが、 Console.WriteLine(m); //これだとコンパイルエラーになる このやり方だとエラーになります。 なんとかしてint型やobject型のようにToString()を使わずに 表示させることはできないでしょうか?

専門家に質問してみよう