Win SFU (Services for Unix)環境下で2GB超ファイルの末尾を取得する方法

このQ&Aのポイント
  • Win SFU (Services for Unix)環境下で2GB超のファイルの末尾を取得する方法について教えてください。
  • 2GB超のファイルを操作する必要があり、Win2Kを使って、その下でUnixコマンドを使用できるよう、SFU (Services for Unix) を使用しています。しかし、tail -c や、dd コマンドを使用してもうまくファイルの末尾を取得できません。別の方法を教えてください。
  • ファイルのサイズは都度変わり、2GB以上のファイルが既に書き込まれています。NTFS上においては、単純なファイル操作コマンドは機能しています。SFUのkshを使用しており、他の処理と連携するシステムの一部として構築しています。手動での操作を排除し、2GB超のファイルの末尾を取得する方法を教えてください。
回答を見る
  • ベストアンサー

Win SFU (Services for Unix)環境下で2GB超ファイルの末尾を取得したい

業務上、2GB超のファイルを操作する必要があり、Win2Kを使って、その下でUnixコマンドを使用できるよう、SFU (Services for Unix) を使用しています。 そのシステム上で、2GB超のファイルの末尾nバイトを取得する処理が必要になるのですが、tail -c や、dd 等を使用しても、ファイルの末尾を取得するのではなく、変な動きをしてしまいます。 何か別の方法をご存知でしたら教えて頂けますでしょうか。 <前提> 1. ファイルの大きさは、都度変わりうる(min: 0, max: 数十GB) 2. NTFS上に、2GB超のファイルを既に書けていて、wc などの、単純にファイルを先頭から操作するコマンドは機能している。 3. SFUのkshを使用している。(他処理と連携したシステムの一部として作りたいので、パイプ・リダイレクト等で繋いで手操作はゼロにしたい) <既に試してダメだった方法> tail -c n ... 先頭からファイルを参照しているような動きをする tail +c ファイルサイズ-n ... 'Could not seek to byte -2139091255n file 'とエラーになる dd ... seek=n ... tail + と同様に、seekが失敗したとのエラー表示をし、エラーになる Perlでseekシステムコール システムコールが失敗する。 よろしくお願いします。

  • stosh
  • お礼率33% (3/9)

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

  • ベストアンサー
  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.1

SFUで扱えるファイルサイズの最大を確認してみて下さい。 多くのUNIX/Linuxはfopen()を利用してますが、 ファイル内のオフセットをlong(int)で持っているので、これだと最大オフセットが 2^31=2Gで、それを超えるサイズのファイルはアクセスできません。 Solarisなどでは64bitモードがあるのでfopen64()で大規模ファイルにアクセス できます。 fopen64()が使えるなら、C言語などで簡単なプログラムを組めば良いです。

参考URL:
http://jp.sun.com/products/software/solaris/wp/Sol_file/sol_4.html
stosh
質問者

お礼

返答が遅くなりましたが、質問への回答ありがとうございます。 結局のところ、Cでファイルの末尾を取得するためのコーディングに入ることになりましたので、参考にさせていただきます。

その他の回答 (1)

  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.2

最近のLinuxではtail、wcコマンドなどは内部で以下のシステムコール を実行しています。 open("/var/log/messages", O_RDONLY|O_LARGEFILE) = 3 O_LARGEFILEの意味を確認すると、 # man 2 open OPEN(2)    System calls     OPEN(2) NAME  open, creat - open and possibly create a file or device SYNOPSIS  #include <sys/types.h>  #include <sys/stat.h>  #include <fcntl.h>  int open(const char *pathname, int flags);  int open(const char *pathname, int flags, mode_t mode);  int creat(const char *pathname, mode_t mode); DESCRIPTION  O_LARGEFILE   On 32-bit systems that support the Large Files System, allow   files whose sizes cannot be represented in 31 bits to be opened. O_LARGEFILEを指定すると 2^32=4GB のサポートとなり、指定しない場合は 2^31=2GB となります。

関連するQ&A

  • ファイルの末尾に達しましたって…

    winのXPを使っていますが 今朝突然のシャットダウンで データが壊れてしまったようで開けなく 成ってしまいました…! どなたか良いファイル修復サイト 御存知有りませんか!? ●PhotoshopCSで作成、.psdファイル  解像度300、17.5 MB  要求された操作を完了できません。  予期せずファイルの末尾に達しました。  というエラーメッセージが出ます 超急募です!12月25日まで御返答募集です 宜しくお願いします!

  • 大きいサイズのファイルの扱い方 UNIX AIX

    お世話になります。 UNIX(AIX)環境での大きいサイズのファイルの扱いについての質問です。 viで大きいサイズ(500MBくらい)のテキストファイルを 開きたいのですが、マシンのメモリ不足で開くことができません。 このような大きいサイズのファイルを 大雑把にわけたい(3等分とか、5等分とか)のですが どのような方法があるか?教えてください。 (マシンの性能を上げる!という解答以外でおねがいします。) wcコマンドで全体の行数を調べようとしても、エラーが帰ってきてしまって調べられません。 headコマンドで頭から100行出力しようとしてもエラーが帰ってきます。 tailコマンドを使えば、ファイルの終端から、サイズを決めて出力することは、できます。 tailコマンド使用例 tail -k 50000 AAA.txt > BBB.txt

  • ファイルサイズの取得について

    2つのテキストファイルのサイズを取得し、そのファイルサイズ分だけを動的にメモリを確保しようとしています。 int *c,*a;と宣言し、 fp=fopen("./data/Problem.txt","r");//1つ目のファイル fseek(fp, 0, SEEK_END); /* ファイルの終端までシーク */ size = ftell(fp); /* 終端の位置、すなわちファイルサイズを得る */ fseek(fp, 0, SEEK_SET); /* ファイルの先頭に戻る */ c = (int *)malloc(size); /* ファイルサイズ分メモリ確保 */ while((x=fgetc(fp))!=EOF){ c[i]=x; i++; } c[i]='\0'; i=0; fclose(fp); fpa=fopen("./data/Answer.txt","r");//2つ目のファイル fseek(fpa, 0, SEEK_END); size = ftell(fpa); fseek(fpa, 0, SEEK_SET); a = (int *)malloc(size); while((x=fgetc(fpa))!=EOF){ a[n]=x; n++; } a[n]='\0';//・・・・(1) n=0; fclose(fpa); とすると1つ目のファイルの方だけはうまくいくのですが、(1)の部分で 「sample.exeの0x00411dcでハンドルされていない例外が発生しました:0xc0000005:場所0x0000000に書き込み中にアクセス違反が発生しました。。」 というエラーが出ます。 また、 int *c,*a;を int *c,a[300]; のように片方を配列として宣言し、 //a = (int *)malloc(size); /* ファイルサイズ分メモリ確保 */ のようにコメントアウトすると上記のエラーは出ずにcにメモリは確保されているようです。 これは何故なのでしょうか? また、どうすればaとcでメモリを確保出来るようになるのでしょうか? よろしくお願いいたします。

  • UNIXのシェル、環境設定について教えてください。

    こんにちは。 UNIXについて詳しく勉強したいとおもっています。 コマンドなど基本的なファイル操作についてはある程度わかるのですが、UNIXの環境設定、環境変数、シェルなどの物につまづいています。 「環境変数って一体なんだよ!」 「シェルのBシェル、Cシェルって・・・」 こんな感じです。 これらについて初心者でもわかるような本、サイトを教えてください。 あと、初心者すぎて恥ずかしい質問なのですが、UNIX系OSにはいろいろな種類があるのは知っているのですが、「UNIX」という名前のOSはあるのでしょうか? また、Teratermを使っているのですが、これって何ていう名前のOSなのでしょうか? 最後に、会社なのでは、SolarisとLinuxどちらが多く使われているのでしょうか? これらの質問に詳しい諸先輩方アドバイスの方をよろしくお願いします。

  • 4GBを超えるファイルをダウンロードできない

    4GBを超えるファイルをダウンロードしようと思ったのですが、 「現在使用されているOSのファイルシステムが4GBを超えるサイズのファイルに対応していません。」 とかでてきてダウンロードできません。 どうにかダウンロードできないのでしょうか? 教えてください、お願いします。

  • 4GBを超えるファイルのダウンロード

    OSはVistaSP1でファイルシステムはNTFSですので、4GB以上のファイルのできるはずだと思うのですが、http://www.rcis.aist.go.jp/project/knoppix/から、Knoppix5.3.1(4.3GB)をダウンロードしようとしているのですが、3.99GBからそれ以上進行しません。情報をお持ちの方、お教えください。HDDはCドライブだけで、NTFSです。

  • 大容量のファイルをseek関数で操作したい。

    教えててください。 OSは、Turbo Linuxです。 現在、大容量のファイルを操作するのに、標準関数で行おうと思っています。 seek関数を使用する場合、先頭からの位置を指定しようとするとint型の位置(符号付4バイト)になるので、容量とすると、1.9GBが限界になると思います。 しかし、扱いたいファイルの容量は、もっと大容量(200GB以上)になるので、「シークできないのでは?」と思いました。 大容量のファイルを扱う方法は、標準関数以外に何かあるのでしょうか?それとも、駆使して操作するのでしょうか?

  • Generic Host Process for Win32 Servicesのエラー(ログあり)

    初めて投稿させて頂きます。 同じタイトルのものがたくさんありましたが、エラーの現象が異なるため投稿させて頂きました。 以下環境などを記載します。 ◆自作PC OS:Windows XP Home Edition Service Pack2 マザーボード:Asus M2N-SLI Deluxe CPU:AMD Athlon(tm) 64 X2 Dual Core Processor 5600+ 2.81GHz メモリ:2.00GB RAM グラフィックボード:NVIDIA GeForce 8600 GT セキュリティソフト Kaspersky Internet Security 2009 (昨日まで2008を使用) 回線:TEPCO光 エラーが起きるまでのまでの時間はバラバラ。 ◆エラーの現象 エラーが出るとインターネット回線が強制遮断される。 もう一度接続しようとしても表示されない。(スタート→接続×、すべての接続の表示→普段使用している広帯域ダブルクリック×) ◆現象が起きるときに起動しているアプリなど 放置していても起きるため詳細がわかりません。 ◆行った対策など ・OSの再インストール ・プリンタは使用したことがない。 ・Internet Explorer を止めて、FireFoxやSleipnirを使う。  (IEのアンインストールはしていません) ・セキュリティソフトを最新版に更新してシステムスキャン  (ウィルスは見つかりませんでした) ・セキュリティソフトをインストールせずに使用 ・インターネットのテンポラリーファイル、履歴、キャッシュ(?)、Cookie等の全消去。 ・マイクロソフトのページで、対策プログラム(?)をダウンロードして実施。 ・自動更新は無効 エラーログが長いため次に記載します。

  • VB.NETでファイル操作

    ファイルをオープンしたまま、ファイル内のデータを何度も読み込みたいのですが、Seekで読み込み位置を先頭にし、Peekでループさせ、一度全部読み込み終わった後、Seek文で先頭に戻し、再度ファイルの先頭から読み込ませようと思ったのですができません。 なぜなのでしょうか? // ファイルオープン StreamReader sr = new StreamReader( (System.IO.Stream) File.OpenRead("C:\\Temp\\Test.txt"), System.Text.Encoding.ASCII); // 最後まで読み出す sr.BaseStream.Seek(0, SeekOrigin.Begin); while (sr.Peek() > -1) { Console.WriteLine(sr.ReadLine()); } // もう一度 sr.BaseStream.Seek(0, SeekOrigin.Begin); while (sr.Peek() > -1) {         ←このWhileの中に入らない。 Console.WriteLine(sr.ReadLine()); } // ファイルクローズ sr.Close();

  • テキストファイルの一行目に特定の文字を追加するソフトを探しています

    テキストファイルの一行目に特定の文字を追加するソフトを探しています。さらに、ファイルの先頭から何行かを削除する操作もできると助かります。 私はCとフォートランを使うので、 UNIX上でそうゆう操作をするようなプログラムを作るのは可能なのですが・・・ ウィウンドウズ上で、条件を指定しておけば、 あとはドラッグ&ドロップでそうゆうことをやってもらえるソフトがあれば便利なのに!・・と思います。 UNIX上では、読む込むファイルをいちいち指定するのが面倒で・・。

専門家に質問してみよう