HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0630
panda独自のファイルシステム(アーカイブフォーマット)を作ろう!6解決


panda

リンク

2008/6/30(Mon) 21:40:47|NO.17102

くだらないネタが思いついたので書かせてください…(^^ゝ

以前、HSPでOSは作れるかというような質問があったと思います。
無論、現在の公式配布のもので開発は不可能です。

しかし、Windows上で動作するOSもどきというのを作ってみたら面白いのではないかと考え
(あくまでアート(art)的な意味で)いろいろ考えてみました。

そこで、OSには欠かせないHSP独自のファイルシステムを皆さんで開発しませんか?

Windows上で動作するために、実際本物のHDDを制御するわけにはいきません。
…ですので、1ファイルを1ディスクと見立てて仮想的なマシンがある状態で動作するというものを間が手見ました。

簡単な例が MS社の バーチャルPC ですね。あれも仮想HDDを使ってます。

今回は基礎であるファイルの I/O のみを作成しました。
GUI部分はまだ作ってません。誰かが作ってもいいです。
また気が向いたら改良したいですが、皆さんと一緒に開発したいので
(誰が作ったっていう概念はナシ。みんなで作るということ)
協力願います。


;-------- ; 現在勝手に決めた HSPFS の仕様。勝手に改良してやってください。(っというか、是非) ; ; 先頭から 5byte は必ず "HSPFS" となり、ファイルシステムをあらわす。(ファイルヘッダーにもなる) ; 6byte 以降 0x10 〜 0x11 の間はファイル名の情報が入る。 ; さらに、以降 0x11 〜 0x12 の間にはファイルサイズ情報が入る。 ; ファイル名、ファイルサイズを区切るときは 0x2A(*) を使う。 ; ; 例: [HSPFS |0x10| hsp3.exe**hsed3.exe |0x11| 159744**241664 |0x12|@ここからずっとデーター@] ; → 上の例では、1つ目のファイル、hsp3.exe (159744バイト) と 2つ目のファイルhsed3.exe(241664バイト) が混合していることになる。 ;-------- // すべてのディスクデーターが入るバッファサイズ v_BufferSize = 1024*1024*100 // 仮想ディスクのファイル名 FileDISK = "hspfs.hdd" // 一時的に開くフォルダ TempOpenPath = ""+dir_desktop+"\\" // ファイル名情報を収めるバッファ sdim FileNameList,1024*512 // ファイルサイズ情報を納めるバッファ sdim FileSizeList,1024*512 // 仮想ディスクが存在するかチェック exist FileDISK size = strsize SIZE_HDD = size if size = -1{ dialog "ディスク ["+FileDISK+"] が見つかりませんでした...",1,"ERROR [1]" } // バッファの分だけ確保 sdim buf,v_BufferSize bload FileDISK,buf,size // [ファイルシステムヘッダー]からファイルシステムを判断 if strmid(buf,0,5) ! "HSPFS"{ dialog "対応していないバーチャルディスクまたはファイルシステムです",1,"ERROR [2]" } // 何バイト目から何バイト目までが[ファイル情報、ファイルサイズ情報]か調べる repeat size if (peek(buf,cnt)==0x10){ NameHead_start = cnt } if (peek(buf,cnt)==0x11){ NameHead_end = cnt SizeHead_start = cnt } if (peek(buf,cnt)==0x12){ SizeHead_end = cnt ALLHead_end = cnt+1 break } loop NameHead_size = (NameHead_end-NameHead_start)-1 ; [ファイル名情報ヘッダー] サイズ SizeHead_size = (SizeHead_end-SizeHead_start)-1 ; [ファイルサイズ情報ヘッダー] サイズ // [ファイル情報ヘッダー] がゼロの場合は不正 if ((NameHead_start==0)or(NameHead_end==0)) { dialog "ディスク ["+FileDISK+"] は壊れているために使用できません",1,"ERROR [3]" } // ファイル名情報、ファイルサイズ情報を取得 memcpy FileNameList,buf,NameHead_size,0,7 memcpy FileSizeList,buf,SizeHead_size,0,NameHead_size+8 // 行形式に変換 repeat strlen(FileNameList) if (peek(FileNameList,cnt)==0x2A){ poke FileNameList,cnt,13 : poke FileNameList,cnt+1,10 } loop repeat strlen(FileSizeList) if (peek(FileSizeList,cnt)==0x2A){ poke FileSizeList,cnt,13 : poke FileSizeList,cnt+1,10 } loop // ウィンドウ。 screen 0,800,600 title "HSPFS シェル" syscolor 15 : boxf : syscolor 8 font "MS UI Gothic",24,1 objmode 2 pos 10,20 objsize 128,42 button gosub "開く",*OPEN pos 160,20 button gosub "追加",*IMPORT pos 310,20 button gosub "抽出",*EXPORT pos 460,20 button gosub "プロパティ",*INFO pos 0,80 objsize 800,325 listbox Sel_FileNameList,200,FileNameList stop *IMPORT // めんどくさくなった…orz dialog "誰かつくって(^^ゝ" return *EXPORT gosub *LB_GETINFO : if SIZE=0 : return // 一時的保存先 dialog getpath(NAME,18),17 if stat==0 : return tmp1 = refstr : tmp1+=getpath(NAME,2) // 一部を取り出して保存 sdim tmp2,SIZE memcpy tmp2,buf,SIZE,0,ALLHead_end bsave tmp1,tmp2,SIZE return *INFO gosub *LB_GETINFO : if SIZE=0 : return dialog "ファイル名 : "+NAME+"\nファイルサイズ : "+Size/1024+"KB ("+Size+" byte)\nファイルの種類 : "+getpath(name,2),0,"プロパティ" return *OPEN gosub *LB_GETINFO : if SIZE=0 : return // 一時的保存先 tmp1 = TempOpenPath tmp1+=NAME // 一部を取り出して保存 sdim tmp2,SIZE memcpy tmp2,buf,SIZE,0,ALLHead_end bsave tmp1,tmp2,SIZE // 実行ファイルかを調べる if (getpath(tmp1,18)==".exe")or(getpath(tmp1,18)==".scr"){ mode = 0 } else { mode = 16 } // 実行 exec tmp1,mode return *LB_GETINFO notesel FileSizeList noteget SIZE,Sel_FileName SIZE = int(SIZE) notesel FileNameList noteget NAME,Sel_FileName return

実験につかったファイルをアップロードしておきます。
http://briefcase.yahoo.co.jp/hsp_de_os



この記事に返信する


panda

リンク

2008/6/30(Mon) 21:43:33|NO.17103

追記

本当は、NTFSみたいにアクセス制限、圧縮、暗号化(これなら何とかいける?)、インデックス機能
…などもつけてみたかったんですが、僕の技術では手に負えません…(笑

あと、申し送れましたが、今のところ、HSPFSというファイルシステム名を勝手につけていましたw



As

リンク

2008/7/2(Wed) 20:10:05|NO.17125

HSP開発Wikiのみんなで開発ページで募集を募ってみては如何でしょうか。
画像も使えるので、よりわかりやすい説明ができるかとおもいます。



panda

リンク

2008/7/3(Thu) 18:09:22|NO.17134

なるほど、開発wikiがありましたね。
検討してみたいとおもいます。



panda

リンク

2008/7/6(Sun) 14:46:14|NO.17168

ふと気づいたんですが、上記の定義ではフォルダ(ディレクトリ)という概念がないですね…。
ディレクトリ…ってどんなふうに実装されてるんでしょうか…。

ちょこっと、調べてみたんですが NTFS→非公開 FAT32→ディレクトリツリー となってました。

ツリーってことは、Win32のウィンドウオブジェクトにもある、ツリービューみたいな感じでしょうかね?
参考になるサイトがあれば教えていただけるとうれしいのですがどなたかご存知の方おられますか?

また、パクってもしょうがないので最終的には独自形式っぽくするつもりですけど、どうも思いつかなくて(^^;;



いかろ

リンク

2008/7/8(Tue) 10:36:51|NO.17191

ふと思いついたんで書いときます。
ファイル内では入れているファイル順番を固定しといて、別のディレクトリ管理用のデータで
どこに何があるかという情報とユーザーが編集したディレクトリ情報を関連付けばいいんじゃ
ないでしょうか?と書いたもののスクリプトが思いつかないw



エレキ掃除機

リンク

2008/7/18(Fri) 14:14:57|NO.17371

圧縮フォーマットもどきをつくっつているんですか?
ぜひ参加したいです。



ONION software Copyright 1997-2023(c) All rights reserved.