参考情報
NTFS Alternate Streams- What, When, and How To
初めてのNTFS代替データストリームとstreamsの出力について
NTFSにこういう機能があるのを、そういえばWin2000時代に目にした覚えがあったのですが、
最近まですっかり忘れてました。ざっと走り書き。
コマンドラインでの表示
cmd.exeからdir /wで見えます。
どうやってアクセスするの?
普通にファイル名に:(コロン)で区切ったファイルを指定すると作成できます。
下記の例だと、同時にtest.txtも作成されます。
      FILE *fp;
      fp=fopen("c:\\Temp\\test.txt:1", "w");
      if(fp!=NULL){
        fprintf(fp, "test\n");
        fclose(fp);
      }
      fp=fopen("c:\\Temp\\test.txt:1", "r");
      if(fp!=NULL){
        char buf[32];
        fscanf(fp, "%s", buf);
        fclose(fp);
      }
代替ストリームがあるか、どうやって調べるの?
FindFirstFile()に類似の名称のFindFirstStreamW()で調べることができます。
ただし、*を使用してのワイルドカード指定はできないようで、直接ファイル名を入力します。
(下記、いまだANSIでコーディングしてるので、ちょっと見づらくてごめんなさい)
      char pdir[MAX_PATH]{};
      char cdir[MAX_PATH]{};
      sprintf(pdir, "c:\\Temp");
      GetCurrentDirectory(MAX_PATH, cdir);
      SetCurrentDirectory(pdir);
      {
        WIN32_FIND_DATA fileData;
        HANDLE fileHandle=FindFirstFile("*", &fileData);
        while(fileHandle!=INVALID_HANDLE_VALUE){
          if(((fileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)==0)&&
             (strcmp(fileData.cFileName, ".")!=0)&&(strcmp(fileData.cFileName, "..")!=0)){
            wchar_t wtxt[MAX_PATH]{};
            MultiByteToWideChar(CP_ACP, 0, fileData.cFileName, -1, wtxt, MAX_PATH);
            {
              WIN32_FIND_STREAM_DATA streamData;
              HANDLE streamHandle=FindFirstStreamW(wtxt, FindStreamInfoStandard, &streamData, 0);
              while(streamHandle!=INVALID_HANDLE_VALUE){
                char mtxt[MAX_PATH]{};
                WideCharToMultiByte(CP_ACP, 0, streamData.cStreamName, -1, mtxt, MAX_PATH, NULL, NULL);
                if(!FindNextStreamW(streamHandle, &streamData)) break;
              }
              FindClose(streamHandle);
            }
          }
          if(!FindNextFile(fileHandle, &fileData)) break;
        }
        FindClose(fileHandle);
      }
      SetCurrentDirectory(cdir);
とすると、こんな感じで取得できます。
test.txt
::$DATA
:1:$DATA
代表的な使用例は?
「このファイルは、インターネット上の場所から取得されており、安全でない可能性があります。」とかいう表示有無にこっそりと使用されています。
そのストリーム名は
filename:Zone.Identifier:$DATA
ということです。
そのストリーム内に下記IDが書かれるようです。(詳細はリンクとかたどってください。)
[ZoneTransfer]
ZoneId=3
public enum SecurityZone
{
        NoZone = -1,
        MyComputer = 0,
        Intranet = 1,
        Trusted = 2,
        Internet = 3,
        Untrusted = 4,
}