none
GetTempFileName in .NET RRS feed

  • Frage

  • Hi,

    ich bin auf der Suche nach einer Funktion im .NET Framework, die

    GetTempFileName(lpPathName As String, lpPrefixString As String, uUnique As Long, lpTempFileName As String) As Long

    entspricht. Gibt es da etwas?

    Vielen Dank,

    Christian.

    Mittwoch, 18. Januar 2012 09:38

Antworten

  • Hallo Christian,

    Möchtest Du einen eigenen Prefix oder einen anderen Pfad verwenden, kannst Du deinen eigenen Wrapper erstellen, z.B.:

    public class NativeMethods {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern uint GetTempFileName(string tempPath, string prefix, uint uniqueIdOrZero, StringBuilder tempFileName);
    
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        static extern int FormatMessage(int dwFlags, IntPtr lpSource, int dwMessageId, int dwLanguageId, StringBuilder lpBuffer, int nSize, IntPtr va_list_arguments);
     
        public static string GetTempFileName(string tempPath, string  prefix) {
            StringBuilder fileNameBuilder = new StringBuilder(260);
            if (GetTempFileName(tempPath, prefix, 0, fileNameBuilder) == 0) {
                int errorCode = Marshal.GetLastWin32Error();
                throw new IOException(GetMessage(errorCode));
            }
                
            string tempFileName = fileNameBuilder.ToString();
            return tempFileName;
        }
    
        private static string GetMessage(int errorCode) {
            StringBuilder buffer = new StringBuilder(512);
            IntPtr nullPointer = IntPtr.Zero;
    
            if (FormatMessage(0x3200, nullPointer, errorCode, 0, buffer, buffer.Capacity, nullPointer) != 0)
                return buffer.ToString();
    
            return String.Format("Unbekannter Fehler: {0}", errorCode);
        }
    }
    
    


    Gruß
    Marcel

    • Als Antwort markiert Christian315 Mittwoch, 18. Januar 2012 15:08
    Mittwoch, 18. Januar 2012 10:24
    Moderator
  • Hallo Christian,

    in .NET gibt es zunächst Path.GetTempFileName, die Methode erlaubt aber keine Präfixwahhl und verwendet "tmp",
    auch wenn sie intern die von Dir gezeigte Windows API Funktion nutzt.
    Alternativ wäre da noch GetRandomFilename, die einen zufälligen Namen erzeugt
    und mit GetTempPath kombiniert werden kann.

    Gruß Elmar


    Mittwoch, 18. Januar 2012 10:14
    Beantworter

Alle Antworten

  • Hallo Christian,

    in .NET gibt es zunächst Path.GetTempFileName, die Methode erlaubt aber keine Präfixwahhl und verwendet "tmp",
    auch wenn sie intern die von Dir gezeigte Windows API Funktion nutzt.
    Alternativ wäre da noch GetRandomFilename, die einen zufälligen Namen erzeugt
    und mit GetTempPath kombiniert werden kann.

    Gruß Elmar


    Mittwoch, 18. Januar 2012 10:14
    Beantworter
  • Hallo Elmar,

    vielen Dank für die Info.

    Ich werde die zwei Funktionen kombinieren.

    Liebe Grüße,

    Christian.

    Mittwoch, 18. Januar 2012 10:19
  • Hallo Christian,

    Möchtest Du einen eigenen Prefix oder einen anderen Pfad verwenden, kannst Du deinen eigenen Wrapper erstellen, z.B.:

    public class NativeMethods {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern uint GetTempFileName(string tempPath, string prefix, uint uniqueIdOrZero, StringBuilder tempFileName);
    
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        static extern int FormatMessage(int dwFlags, IntPtr lpSource, int dwMessageId, int dwLanguageId, StringBuilder lpBuffer, int nSize, IntPtr va_list_arguments);
     
        public static string GetTempFileName(string tempPath, string  prefix) {
            StringBuilder fileNameBuilder = new StringBuilder(260);
            if (GetTempFileName(tempPath, prefix, 0, fileNameBuilder) == 0) {
                int errorCode = Marshal.GetLastWin32Error();
                throw new IOException(GetMessage(errorCode));
            }
                
            string tempFileName = fileNameBuilder.ToString();
            return tempFileName;
        }
    
        private static string GetMessage(int errorCode) {
            StringBuilder buffer = new StringBuilder(512);
            IntPtr nullPointer = IntPtr.Zero;
    
            if (FormatMessage(0x3200, nullPointer, errorCode, 0, buffer, buffer.Capacity, nullPointer) != 0)
                return buffer.ToString();
    
            return String.Format("Unbekannter Fehler: {0}", errorCode);
        }
    }
    
    


    Gruß
    Marcel

    • Als Antwort markiert Christian315 Mittwoch, 18. Januar 2012 15:08
    Mittwoch, 18. Januar 2012 10:24
    Moderator
  • Hi Marcel,

    vielen Dank für das umfangreiche Beispiel.

    Liebe Grüße,

    Christian.

    Mittwoch, 18. Januar 2012 15:09