それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Windowsのホームディレクトリに出てくる、dotfiles を非表示にする。

windows のユーザーディレクトリにdotfiles があふれる。。

cygwinとかmsys 使ってたり、UNIXのコマンドを使うとドットファイルがあふれる。

これが美しくないのよ。ていうか邪魔

シンプルな解決策

attrib -h .bashrc

attribコマンドでファイルの属性を、「非表示」にしてあげれば、解決する。

でも、なんども非表示するのもめんどくさい。

ドットファイルをまとめて非表示にするプログラムがあればいいと思うの。

さらに、そのプログラムを定期的にattrib を実行すればいいと思うの。

フォルダ監視して、attrib を実行しておけば、ずっと見えないと思うんだよね。

非表示にするソースをぱぱっと書いた

#!/usr/bin/env ruby
#ドットから始まるファイルに隠しファイル属性を付加する
require 'rubygems'
require 'win32/file'

home = ENV["HOME"] 
home = `cygpath -w #{home}`.strip if RUBY_PLATFORM =~ /cygwin/
dotfiles = Dir.open(home).grep /^\.[^\.]+/
dotfiles + ["Downloads","Contacts","Searches"] + %w/Favorites Downloads Videos Music Contacts/
dotfiles.map!{|e| File.expand_path e, home }
#puts dotfiles
dotfiles.select{|e| true unless File.hidden? e }.each{|e| File.open(e){|f|f.hidden=true}}

でもrubyだとインストール面倒

rubywin32-fileを使えば解決するんだけどさ、コマンド登録面倒じゃないか。

スタートアップに登録したり、フォルダ監視に登録したり、サービスに登録するのも面倒じゃないか。

Win32 api で書けばいいよね。

windowだし、C/C++で書いておけば、ずっと使えると思うの。ruby のバージョンアップとか文字コードだとか、rubyのgemだとかそういうものに左右されない.

やっぱりwindows使うなら win32で書いておくのが鉄板だとおもうの。

dotfileをけす。

# include <windows.h>
//# include <stdio.h>


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

    WIN32_FIND_DATA FindFileData;
    HANDLE hFind;
    DWORD attrs;
    

    char* target_name = ".*";  
    char* target_dir;
    char* target;
    char* full_path;
    char buff[1024];
    
    GetEnvironmentVariable("USERPROFILE", buff, 1024);
    target_dir = (char *) malloc( sizeof(char) * lstrlen(buff) );
    lstrcpy(target_dir,buff);
    
    //文字列コピー sprintfのほうが楽かも・・・
    lstrcpy(buff, target_dir);
    lstrcat(buff, "\\");
    lstrcat(buff, target_name);
    target = (char *) malloc( sizeof(char) * lstrlen(buff) );
    lstrcpy(target,buff);

    //printf("target file is \"%s\".\n", target );
    hFind = FindFirstFile( target,&FindFileData);
    if ( hFind == INVALID_HANDLE_VALUE)
    {
        //printf("Invalid file handle: %d\n", GetLastError() );
        return 1;
    }
    
    do{
        if (lstrcmp(FindFileData.cFileName,".") == 0){
            continue;
        }
        if (lstrcmp(FindFileData.cFileName,"..") == 0){
            continue;
        }
        lstrcpy(buff, target_dir);
        lstrcat(buff, "\\");
        lstrcat(buff,FindFileData.cFileName );
        full_path = (char *) malloc( sizeof(char) * lstrlen(buff)+1024);
        lstrcpy(full_path,buff);
        

        SetFileAttributes(full_path, FILE_ATTRIBUTE_HIDDEN);
        attrs = GetFileAttributes(full_path);
        //printf("%s => 0x%04x\n",full_path, attrs);
        
    }while( FindNextFile( hFind,&FindFileData));
    
    FindClose(hFind);
    
    free(target_dir);
    free(target);
    free(full_path);
    
    return 0;
}

cygwinとかのgccコンパイル

i686-pc-mingw32-gcc hide-dots.c -o hide-dot-files -mwindows

これですっきりするよね。あとはスタートアップとかに仕込んでおけば結構楽になるわ

参考資料

Windows7:attribコマンドの使い方(属性を表示/設定/解除する)- 教えて!HELPDESK

https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa365535(v=vs.85).aspx