UDF > WinAPIEx > Files & Devices > Files >


_WinAPI_FindFirstStream

Énumère le premier flux avec un type de flux ::$DATA dans le fichier ou le répertoire spécifié

#include <WinAPIFiles.au3>
_WinAPI_FindFirstStream ( $sFilePath, $tData )

Paramètres

$sFilePath Le nom du fichier complet.
$tData Une structure $tagWIN32_FIND_STREAM_DATA, ou un pointeur sur une telle structure, qui reçoit des informations sur le flux.

Valeur de retour

Succès: Retourne le handle de recherche.
Échec: Retourne 0 et définit @error <> 0, @extended peut contenir le code d'erreur du système.

Remarques

Cette fonction ouvre le handle de recherche et retourne des informations sur le premier flux dans le fichier ou le répertoire spécifié.
Pour les fichiers, le premier flux est toujours le flux de données par défaut, "::$DATA".
Après la mise en place du handle de recherche, vous pouvez l'utiliser dans la fonction _WinAPI_FindNextStream() pour rechercher d'autres flux dans le fichier ou le répertoire spécifié.

Si la fonction échoue car aucun flux ne peut être trouvé, @extended contiendra le code d'erreur système ERROR_HANDLE_EOF (38).

Lorsque le handle de la recherche n'est plus utile, il doit être fermé à l'aide de la fonction _WinAPI_FindClose().

Cette fonction nécessite Windows Vista ou une version ultérieure.

En relation

_WinAPI_FindClose, _WinAPI_FindNextStream

Voir aussi

Consultez FindFirstStreamW dans la librairie MSDN.

Exemple

#include <MsgBoxConstants.au3>
#include <WinAPIError.au3>
#include <WinAPIFiles.au3>
#include <WinAPIHObj.au3>
#include <WinAPIMem.au3>
#include <WinAPIMisc.au3>
#include <WinAPIShPath.au3>

Local Const $sTempFile = @TempDir & '\Test.txt'

; Vérifie le système de fichiers NTFS
If StringCompare(DriveGetFileSystem(_WinAPI_PathStripToRoot($sTempFile)), 'NTFS') Then
    MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Erreur', 'Le fichier doit se trouver sur un volume avec un système de fichier NTFS.')
    Exit
EndIf

Local $sName, $iBytes, $pData, $hFile
; Crée un fichier texte avec trois flux alternatifs nommés AS1, AS2, AS3
For $i = 0 To 3
    If $i Then
        $pData = _WinAPI_CreateString('Flux Alternatif ' & $i)
        $sName = ':AS' & $i
    Else
        $pData = _WinAPI_CreateString('Flux principal')
        $sName = ''
    EndIf
    $hFile = _WinAPI_CreateFile($sTempFile & $sName, 1, 4)
    _WinAPI_WriteFile($hFile, $pData, _WinAPI_GetMemorySize($pData) - 2, $iBytes)
    _WinAPI_CloseHandle($hFile)
    _WinAPI_FreeMemory($pData)
Next

; Énumére tous les flux existants dans le fichier et lit les données texte de chaque flux
$pData = _WinAPI_CreateBuffer(1024)

Local $tFSD = DllStructCreate($tagWIN32_FIND_STREAM_DATA)

Local $hSearch = _WinAPI_FindFirstStream($sTempFile, $tFSD)
Local $iSize
While @error = 0
    $sName = DllStructGetData($tFSD, 'StreamName')
    $iSize = DllStructGetData($tFSD, 'StreamSize')
    $hFile = _WinAPI_CreateFile($sTempFile & $sName, 2, 2, 6)
    _WinAPI_ReadFile($hFile, $pData, $iSize, $iBytes)
    _WinAPI_CloseHandle($hFile)
    ConsoleWrite(StringFormat('%10s (%s bytes) - %s', $sName, $iSize, _WinAPI_GetString($pData)) & @CRLF)
    _WinAPI_FindNextStream($hSearch, $tFSD)
WEnd

Switch @extended
    Case 38 ; ERROR_HANDLE_EOF

    Case Else
        MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), @extended, _WinAPI_GetErrorMessage(@extended))
EndSwitch

_WinAPI_FindClose($hSearch)

_WinAPI_FreeMemory($pData)

FileDelete($sTempFile)