Win環境での隠しファイルの扱い方法

このQ&Aのポイント
  • Win環境でのファイル属性を利用した隠しファイルの扱い方法について説明します。
  • java.io.FileクラスのisHiddenメソッドを使用することで、ファイルが隠しファイル属性かどうかを判別できます。
  • しかし、org.apache.commons.io.FileUtilsなどを使用しても隠しファイルの作成や変更がうまくできないようです。
回答を見る
  • ベストアンサー

隠しファイルの扱い

Win環境で、隠しファイルを扱いたいと思っています。 java.io.FileクラスにてisHiddenというメソッドにてそのファイルが隠しファイル属性かどうかを判別できます。すなわち、(タブン)WinAPIを利用してファイル属性の取得を行っているのだと理解しています。 ということは、普通のファイルを隠しファイル属性にしたり、隠しファイルを作成するもしくは、隠しファイルをコピーして隠しファイルを作ることができてもいいのではないかと思っているのですが、org.apache.commons.io.FileUtils 等を利用しても今のところうまく行っていません。 なんとか、隠しファイルのコピー生成・変更等を行いたいと思っています。もし方法があればご教授よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • gimmick
  • ベストアンサー率49% (134/270)
回答No.1

Windows限定でしたら、Runtime#exec()でattrib.exeを呼べばよいかと思います。 //隠し属性設定メソッド public static void setHidden(String filename) {  String cmd = "attrib.exe +h " + filename;  Process p = Runtime.getRuntime().exec(cmd);  p.waitFor(); } #動作確認をしていないので、ミスしてるかもしれません。

arakororin
質問者

お礼

なるほど。 ちと乱暴な気もしますが実現できました。 ありがとうございます。 でもできれば、直接コマンドを実行してしまうのではなく、JavaのVMを介してそれぞれの環境に対して影響を与えるような記述ができればいいなと思っています…。 やっぱりそれは無理ということなんでしょうか。

その他の回答 (1)

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.2

>でもできれば、直接コマンドを実行してしまうのではなく、JavaのVMを介してそれぞれの環境に対して影響を与えるような記述ができればいいなと思っています…。 多分ですが、ファイル属性を変更するような機能はJavaでは提供されていないと思います。 理由はおそらく、ファイル属性自体がファイルシステムに大きく依存するからでしょう。 例えば、Javaで隠し属性を設定するメソッドが提供されたとして、UNIX環境でどういう動作になるのが 妥当なのか、私には見当がつきません。(ファイル名の頭に無理やりドットを付けるとか?) どうしてもプロセス起動を避けたいということでしたら、JNIを使ってネイティブメソッドを呼び出す形に なるかと思います。(面倒なので、お勧めはしませんが…) 例えば、Windowsでファイル属性を設定する場合、「Win32APIのSetFileAttributes()を呼び出す ような関数をCかC++で書いてDLL化しておき、Java側でDLL内の関数を呼び出す」といった処理になります。 JNIについては参考URLを見てください。

参考URL:
http://www.hellohiro.com/native.htm
arakororin
質問者

お礼

やっぱりそうですよね…。 ありがとうございました。

関連するQ&A

  • JAVA ファイル読み込みで文字化け発生

    お世話輪になります。 JAVAでプログラムを作成しているのですが、文字化けが発生してしまいます。ファイルの読み込みには、apache.commons.ioのライブラリを使用しています。インターネット等で調べたのですが、調べた限りでは特にやり方に問題がないように思うのですが、特定のファイルを読み込もうとすると文字化けしてしまいます。 以下が実際のプログラムです。 import org.apache.commons.io.FileUtils; import org.apache.commons.io.LineIterator; ---------------------------------------------- 以下抜粋 ---------------------------------------------- LineIterator iterator = FileUtils.lineIterator("C:\aaa.txt", "EUC-JP"; while(iterator.hasNext()){ String line = iterator.nextLine().split(","); System.out.println(line); あるファイルは正しく読み込まれますが、あるファイルはよみこまれません。 どなたかご存知の方いらっしゃいませんでしょうか? 困っています。何卒よろしくお願いいたします。

  • Java:ファイルの読み込みはどれが速いのか?

    ファイルの読み込み方法についてです. java.ioのBufferdReader.readline java.nioのCharBuffer(ファイルサイズ分のバッファサイズを指定して一気に読み込むことを想定) org.apache.commons.ioのFileUtils.readFileToString の3つを比較した場合,どれが最も高速にテキストファイルを読み込めるのでしょうか? 一見,BufferdReader.readlineだと1行読み込む度にディスクIOが発生するので,大きなサイズのテキストファイルであればあるほど遅くなるような気がします. 想定しているのは,1ファイル約10000行でサイズが3MBぐらい,それを数十万~数百万ファイル逐次読み込んでいく場合です. 回答よろしくお願いします.

    • ベストアンサー
    • Java
  • javax.servlet.ServletExceptionが発生する(ファイルアップロード)

    ファイルのアップロードをするために org.apache.commons.fileupload.FileItemFactory factory=new org.apache.commons.fileupload.disk.DiskFileItemFactory(); org.apache.commons.fileupload.servlet.ServletFileUpload upload=new org.apache.commons.fileupload.servlet.ServletFileUpload(factory); java.util.List<org.apache.commons.fileupload.FileItem> items=upload.parseRequest(request); としているのですが java.util.List<org.apache.commons.fileupload.FileItem> items=upload.parseRequest(request); の行で以下の例外が発生してしまいます。 メッセージ 説明 The server encountered an internal error () that prevented it from fulfilling this request. 例外 javax.servlet.ServletException: サーブレットの実行により例外を投げました 原因 java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:196) org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:358) org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126) BlobUploadProcess.doPost(BlobUploadProcess.java:8) javax.servlet.http.HttpServlet.service(HttpServlet.java:710) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) どのようにすれば解決できるでしょうか?

    • ベストアンサー
    • Java
  • BasicDataSourceについて

    BasicDataSourceについて ドキュメントを見ると closeメソッドがあるのですが DataSource使用後 DataSource自体をclose する必要があるのでしょうか? このDataSourceにより生成された Connectionをクローズすれば問題無いでしょうか? 感覚だとDataSourceなんて 接続先情報(文字列情報)として認識しているので それをcloseするのが良くわかりません。 ドキュメント http://commons.apache.org/dbcp/apidocs/org/apache/commons/dbcp/BasicDataSource.html

    • ベストアンサー
    • Java
  • javaサーブレット upload時

    いつもお世話になっています。 javaサーブレットupload時で質問します。 http://www.ne.jp/asahi/hishidama/home/tech/apache/commons/fileup.html#processFormField と、 http://www.javaroad.jp/servletjsp/sj_servlet12.htm を参考にソースを作成してみたのですが、うまくurlを取得できません。 ソースは、 jsp側 <form method="POST" enctype="multipart/form-data" action="./UploadServlet"> ファイルpath: <input type="file" name="filefd" size=75"/> <br> ファイル名称: <input type="text" name="fileName" value=""> <br> <input type="submit" value="upload"/> </form> javaサーブレット(doGetは省く) public class UploadServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (ServletFileUpload.isMultipartContent(request)) { // ファクトリー生成 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(1426); factory.setRepository(new File("C:\\temp\\file_up")); //一時的に保存する際のディレクトリ ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(20 * 1024); upload.setFileSizeMax(10 * 1024); List items = new ArrayList(); try { items = upload.parseRequest(request); } catch (org.apache.commons.fileupload.FileUploadException e) { e.printStackTrace(); } // 全フィールドに対するループ for(int a=0;a<items.size();a++) { FileItem item = (FileItem) items.get(a); if (item.isFormField()) { // type="file"以外のフィールド processFormField(item); } else { // type="file"のフィールド processUploadedFile(item); } } } } private void processFormField(FileItem item) throws ServletException { System.out.println(item.getFieldName()); try { System.out.println(item.getString("MS932")); } catch (UnsupportedEncodingException e) { throw new ServletException(e); } } private void processUploadedFile(FileItem item) throws ServletException { System.out.println(item.getFieldName()); try { System.out.println(item.getString("MS932")); } catch (UnsupportedEncodingException e) { throw new ServletException(e); } } } このとき、 org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. C:\temp\file_up\upload__1fdbe80e_1279d42d9fc__8000_00000001.tmp (指定されたパスが見つかりません。) Caused by: java.io.FileNotFoundException: C:\temp\file_up\upload__1fdbe80e_1279d42d9fc__8000_00000001.tmp (指定されたパスが見つかりません。) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.<init>(Unknown Source) at java.io.FileOutputStream.<init>(Unknown Source) at org.apache.commons.io.output.DeferredFileOutputStream.thresholdReached(DeferredFileOutputStream.java:165) at org.apache.commons.io.output.ThresholdingOutputStream.checkThreshold(ThresholdingOutputStream.java:221) at org.apache.commons.io.output.ThresholdingOutputStream.write(ThresholdingOutputStream.java:127) at org.apache.commons.fileupload.util.Streams.copy(Streams.java:101) at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64) at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362) ... 16 more のエラーが発生します。 どこが悪いのでしょうか? 宜しくお願いします。

  • Struts2のプログラムについて

    今、Strutsについて勉強しているのですが、自分で作ったサンプルプログラムが動きません。 サンプルプログラムは以下のサイトからそのまま持ってきました。 http://codezine.jp/article/detail/2296?p=2 http://codezine.jp/article/detail/2296?p=3 http://codezine.jp/article/detail/2296?p=4 パソコン環境は次の通りです。 eclipse3.7Indigo Tomcat7.0 Struts2.3.1.2 Java:jdk_1.6.0_18 また、コンソールに出たエラーは次の通りです。 警告: Could not create JarEntryRevision for [jar:file:/D:/eclipse_workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/HelloProject/WEB-INF/lib/struts2-core-2.3.1.2.jar]! java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils [中略] 2012/05/15 22:16:40 org.apache.catalina.core.StandardContext filterStart 致命的: フィルタ struts2 の起動中の例外です java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils [中略] 2012/05/15 22:16:40 org.apache.catalina.core.StandardContext startInternal 致命的: Error filterStart 2012/05/15 22:16:40 org.apache.catalina.core.StandardContext startInternal 致命的: 以前のエラーのためにコンテキストの起動が失敗しました [/HelloProject] -------------------------------------------------------------------------------- どのようにしたらいいかご教授お願いします。 出来るだけ早く、返答していただけると嬉しいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • ファイル属性の変更方法???

    Vista、7でProgram File内にあるデータファイルを更新します 通常のままではエラーになりますので、ファイル属性をフルコントロールに変更したいのです //パスを定数で定義する const string FILE_PATH = @"C:\Program File\MyProgramHolder\Data.txt"; //ファイルの属性を取得する System.IO.FileAttributes uAttribute = System.IO.File.GetAttributes(FILE_PATH); //フルコントロール属性を指定する System.IO.File.SetAttributes(FILE_PATH, uAttribute | System.IO.FileAttributes.XXXXXXX); ところがXXXXXXに指定すべきAttribute値の指定方法が分かりません ぜひご指導お願い致します 追伸】手操作でData.txtのプロパティを変更する方法は理解していますが、日本各地にインストールするので手操作は無理なのです そのためプログラムで属性変更したいのですが、手操作以外の方法はありますか? 例えばインストーラの指定でファイル属性を変更するとか・・・・・・?

  • Senを用いてファイルの移動をさせたいんですが・・

    形態素解析システム「Sen」を用いて、テキストの内容を判別してファイルを移動させたいんですが、以下のプログラムでは「Path」という言葉があったら指定ディレクトリに移動するようにしたいんですが、移動しませんでした。エラーも出ていません。A~Bのif文は通過したんですが・・ 何がまずいんでしょうか?? import java.io.File; import net.java.sen.StringTagger; import net.java.sen.Token; import java.io.BufferedReader; import java.io.FileReader; public class samp1 { public static void main(String args[]) { System.setProperty("sen.home", "./"); System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); try { File F = new File("C:/Documents and Settings/デスクトップ/test"); String path = F.getPath(); System.out.println("指定したディレクトリ:" + path); File a[] = F.listFiles(); for( int i=0; i<a.length; i++ ) { if( a[i].isFile() ){ System.out.println(a[i] + "(ファイル)"); FileReader fr = new FileReader(a[i]); BufferedReader br = new BufferedReader(fr); StringTagger tagger = StringTagger.getInstance(); String s; while ((s = br.readLine()) != null) { Token[] token = tagger.analyze(s); if (token != null) {for (int l = 0; l < token.length; l++) { if(token[l].toString().equals("Path")){ //A File file2 = new File( "C:/Documents and Settings/デスクトップ/receive/"+a[i].getName()); boolean ret = a[i].renameTo( file2 ); System.out.println("移動したデイレクトリ:"+file2.getPath()); //B } } } } } } catch (Exception e) { e.printStackTrace();} } }

    • ベストアンサー
    • Java
  • Tomcat起動時のエラー

    Tomcatを起動すると以下のエラーがでます。 org.apache.commons.digester.Digester endElement 致命的: End event threw exception java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:324) at org.apache.commons.beanutils.PropertyUtils.setSimpleProperty(PropertyUtils.java:1789) at org.apache.commons.beanutils.PropertyUtils.setNestedProperty(PropertyUtils.java:1684) at org.apache.commons.beanutils.PropertyUtils.setProperty(PropertyUtils.java:1713) at org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:1019) at org.apache.commons.digester.BeanPropertySetterRule.end(BeanPropertySetterRule.java:245) at org.apache.commons.digester.Digester.endElement(Digester.java:1064) : : at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:425) Caused by: java.lang.InstantiationException: javax.servlet.ServletContext at java.lang.Class.newInstance0(Class.java:293) at java.lang.Class.newInstance(Class.java:261) at org.apache.velocity.tools.view.ViewToolInfo.setClassname(ViewToolInfo.java:84) 現在、Strutsとvelocityを導入しています。 エラーはでますが動作には支障がありません。 何が原因なのでしょうか。。 誰か原因がわかる方おられませんか。 ご教授、宜しくお願い致します。

  • ファイルの削除が出来ません

    java.io.Fileのdelete()メソッドを利用してファイルの削除をしたいと思っています。 一度もアクセスしていないファイルはdelete()メソッドを利用して削除できるのですが、java.io.Readerなどを利用してファイルの読み込みなどを行った後にそのファイルを削除しようとすると削除がうまく出来ません。 ファイルにアクセスするときに利用したReaderや、Fileのオブジェクトは削除する前にnullを代入して開放しているのですが。。。 どなたか回避方法をご存知の方はいらっしゃいませんでしょうか。よろしくお願いいたします。 コード例: File f = new File(dirName, fileName); BufferedReader br = new BufferedReader(new FileReader(f)); ・・・(読み込みの処理)・・・ f=null; br=null; ・・・ File f = new File(dirName, fileName); boolean b = f.delete(); と、上記のように一度アクセスしたファイルを削除しようとすると、削除が出来ず、変数bにはfalseが入ってしまいます。

    • ベストアンサー
    • Java

専門家に質問してみよう