0

関数でFILE_ID_BOTH_DIR_INFOを取得しようとしていGetFileInformationByHandleます。呼び出し後、すべての値がゼロに設定されます。
次の win32 エラー メッセージが表示されます:
ERROR_BAD_LENGTH プログラムはコマンドを発行しましたが、コマンドの長さが正しくありません。

IntPtr handle = CreateFile(dir, EFileAccess.GenericRead, EFileShare.Read, IntPtr.Zero, ECreationDisposition.OpenExisting, EFileAttributes.BackupSemantics | EFileAttributes.Normal, IntPtr.Zero);
FILE_ID_BOTH_DIR_INFO fileStruct = new FILE_ID_BOTH_DIR_INFO();
GetFileInformationByHandleEx(handle, FILE_INFO_BY_HANDLE_CLASS.FileIdBothDirectoryInfo, out fileStruct, (uint)Marshal.SizeOf(fileStruct));

FILE_ID_BOTH_DIR_INFO 構造体

    typedef struct _FILE_ID_BOTH_DIR_INFO {
    DWORD         NextEntryOffset;
    DWORD         FileIndex;
    LARGE_INTEGER CreationTime;
    LARGE_INTEGER LastAccessTime;
    LARGE_INTEGER LastWriteTime;
    LARGE_INTEGER ChangeTime;
    LARGE_INTEGER EndOfFile;
    LARGE_INTEGER AllocationSize;
    DWORD         FileAttributes;
    DWORD         FileNameLength;
    DWORD         EaSize;
    CCHAR         ShortNameLength;
    WCHAR         ShortName[12];
    LARGE_INTEGER FileId;
    WCHAR         FileName[1];
    } FILE_ID_BOTH_DIR_INFO, *PFILE_ID_BOTH_DIR_INFO

C# の場合

    public struct FILE_ID_BOTH_DIR_INFO
    {
        uint NextEntryOffset;
        uint FileIndex;
        LARGE_INTEGER CreationTime;
        LARGE_INTEGER LastAccessTime;
        LARGE_INTEGER LastWriteTime;
        LARGE_INTEGER ChangeTime;
        LARGE_INTEGER EndOfFile;
        LARGE_INTEGER AllocationSize;
        uint FileAttributes;
        uint FileNameLength;
        uint EaSize;
        char ShortNameLength;
        [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 12)]
        string ShortName;
        LARGE_INTEGER FileId;
        [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 1)]
        string FileName;
    }

    [StructLayout(LayoutKind.Explicit, Size = 8)]
    struct LARGE_INTEGER
    {
        [FieldOffset(0)]
        public Int64 QuadPart;
        [FieldOffset(0)]
        public UInt32 LowPart;
        [FieldOffset(4)]
        public Int32 HighPart;
    }
4

1 に答える 1

2

ByValTStr の文字セットは、StructLayout 属性の CharSet 引数によって決定されます。指定していないため、デフォルトの 8 ビット ANSI が使用されます。CharSet を CharSet.Unicode として指定すると、問題に対処できるはずです。この属性を構造体に追加します。

[StructLayout(LayoutKind.Sequential, 
    CharSet=CharSet.Unicode)]

デバッグのために、構造体のサイズを出力する C++ プログラムを作成します。C# プログラムがその値と一致していることを確認してください。

于 2013-03-22T07:57:25.943 に答える