문제

나는에서 작업하는 프로그램을 만들 필요가 여러한 임시 폴더를 위한 응용 프로그램.이러한 볼 수 없습니다.그에 기록 VB.net.나는 생각할 수 있는 몇 가지 방법으로 할 수와 같은 증분 폴더 이름 또는 임의의 번호가 폴더 이름은,그러나 궁금,다른 사람들이 어떻게 이 문제를 해결하는가?

도움이 되었습니까?

해결책

업데이트: 추가되는 파일입니다.존재하는지 확인 당 댓글(2012-Jun-19 일)

여기에 내가에 사용되는 VB.NET.기본적으로 동일한 표시를 제외하고,나는 보통하고 싶지 않았 폴더를 만들 즉시.

장점 사용하기 GetRandomFilename 이지 않는 파일을 만들고,그래서 당신은 없을 정하는 경우 이름을 사용하여를 위해 무언가가 이외의 다른 파일입니다.다음과 같이 그것을 사용한 폴더 이름입니다.

Private Function GetTempFolder() As String
    Dim folder As String = Path.Combine(Path.GetTempPath, Path.GetRandomFileName)
    Do While Directory.Exists(folder) or File.Exists(folder)
        folder = Path.Combine(Path.GetTempPath, Path.GetRandomFileName)
    Loop

    Return folder
End Function

Random 름이 예제:

C:\Documents and Settings\사용자 이름\Local Settings emp\u3z5e0co.tvq


여기에는 변 Guid 를 사용하는 것을 얻을 수 temp 폴더 이름입니다.

Private Function GetTempFolderGuid() As String
    Dim folder As String = Path.Combine(Path.GetTempPath, Guid.NewGuid.ToString)
    Do While Directory.Exists(folder) or File.Exists(folder)
        folder = Path.Combine(Path.GetTempPath, Guid.NewGuid.ToString)
    Loop

    Return folder
End Function

guid 예제:

C:\Documents and Settings\사용자 이름\Local Settings emp\2dbc6db7-2d45-4b75-b27f-0bd492c60496

다른 팁

당신이 사용하는 System.IO.Path.GetTempFileName()

를 만듭니다 유일하게 이름,영 바이트는 임시 디스크에 있는 파일을 반환합의 전체 경로에 해당 파일이 있습니다.

당신이 사용할 수 있는 System.IO.Path.GetDirectoryName(System.IO.Path.GetTempFileName()) 을 얻을만 temp 폴더에 정보를 만들고 폴더가

들에서 만들어 윈도우 임시 폴더는 최상의 방법을 고려

을 명확히:

System.IO.Path.GetTempPath()

만 반환합한 폴더로 임시 폴더에 있습니다.

System.IO.Path.GetTempFileName()

반환 정규화된 파일 이름(경로를 포함하여)이것:

System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.IO.Path.GetTempFileName())

중복되어 있습니다.

가 있을 경쟁 상태:

  • 을 만드는 임시 파일 GetTempFileName(), 삭제하면,그것을 만들고 폴더 이름은 같으나
  • GetRandomFileName()Guid.NewGuid.ToString 이 폴더를 만드는 폴더중

GetTempFileName() 후 삭제 발생합니다,다른 응용 프로그램을 성공적으로 수 만들기 임시 파일과 동일한 이름입니다.이 CreateDirectory() 그때 실패한다.

마찬가지로,사출 GetRandomFileName() 과 디렉터리를 만들이 다른 프로세스를 만들 수 있는 파일 또는 디렉토리와 같은 이름을 다시 결과 CreateDirectory() 실패합니다.

대부분의 응용 프로그램의 확인을 위해 temp 디렉토리 실패로 인해 경쟁 상태입니다.그것은 매우 드물다.그들이,이러한 경주될 수 있는 무시됩니다.

에서 유닉스는 쉘 스크립트는 세계의 임시 파일과 디렉터리 안전 경주-무료 방법입니다.많은 기계에 있는 여러(적)사용자를 생각한 공유 웹 호스트-그 많은 스크립트와 애플리케이션에 필요한 안전하게 만드 temp 디렉터리와 파일 공유/tmp 디렉토리에 있습니다.보 을 안전하게 만드는 임시 파일에서 쉘 스크립트 에 대한 토론에서 어떻게 안전하게 만드 temp 디렉토리에서 쉘 스크립트가 있습니다.

로@JonathanWright 지적, 경주 조건에 대해 존재하는 솔루션:

  • 임시 파일을 만들과 함께 GetTempFileName(), 를 삭제하고,폴더를 만들과 동일한 이름
  • GetRandomFileName()Guid.NewGuid.ToString 을 만드는 임의 폴더 이름을 확인 존재 여부,그리고 그것을 만들하지 않을 경우.

그것은 가능한 한,그러나,고유 임시 디렉토리 자동으로 활용하여 트랜잭션 NTFS (TxF)API 를 사용합니다.

TxF 가 CreateDirectoryTransacted() 함수 호출할 수 있는 플랫폼을 통해 호출.이렇게 하려면 내가 적용 Mohammad Elsheimy 코드 전화 CreateFileTransacted():

// using System.ComponentModel;
// using System.Runtime.InteropServices;
// using System.Transactions;

[ComImport]
[Guid("79427a2b-f895-40e0-be79-b57dc82ed231")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IKernelTransaction
{
    void GetHandle(out IntPtr pHandle);
}

// 2.2 Win32 Error Codes <http://msdn.microsoft.com/en-us/library/cc231199.aspx>
public const int ERROR_PATH_NOT_FOUND = 0x3;
public const int ERROR_ALREADY_EXISTS = 0xb7;
public const int ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION = 0x1aaf;

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool CreateDirectoryTransacted(string lpTemplateDirectory, string lpNewDirectory, IntPtr lpSecurityAttributes, IntPtr hTransaction);

/// <summary>
/// Creates a uniquely-named directory in the directory named by <paramref name="tempPath"/> and returns the path to it.
/// </summary>
/// <param name="tempPath">Path of a directory in which the temporary directory will be created.</param>
/// <returns>The path of the newly-created temporary directory within <paramref name="tempPath"/>.</returns>
public static string GetTempDirectoryName(string tempPath)
{
    string retPath;

    using (TransactionScope transactionScope = new TransactionScope())
    {
        IKernelTransaction kernelTransaction = (IKernelTransaction)TransactionInterop.GetDtcTransaction(Transaction.Current);
        IntPtr hTransaction;
        kernelTransaction.GetHandle(out hTransaction);

        while (!CreateDirectoryTransacted(null, retPath = Path.Combine(tempPath, Path.GetRandomFileName()), IntPtr.Zero, hTransaction))
        {
            int lastWin32Error = Marshal.GetLastWin32Error();
            switch (lastWin32Error)
            {
                case ERROR_ALREADY_EXISTS:
                    break;
                default:
                    throw new Win32Exception(lastWin32Error);
            }
        }

        transactionScope.Complete();
    }
    return retPath;
}

/// <summary>
/// Equivalent to <c>GetTempDirectoryName(Path.GetTempPath())</c>.
/// </summary>
/// <seealso cref="GetTempDirectoryName(string)"/>
public static string GetTempDirectoryName()
{
    return GetTempDirectoryName(Path.GetTempPath());
}

다.

using System.IO;

string path = Path.GetTempPath() + Path.GetRandomFileName();
while (Directory.Exists(path))
 path = Path.GetTempPath() + Path.GetRandomFileName();

Directory.CreateDirectory(path);

할 수 있습 GUID 를 생성 일시 폴더 이름입니다.

으로 폴더의 이름을 필요가 없다는 의미 있는 방법에 대해 GUID 를 사용하나요?

당신이 사용할 수 있는 GetTempFileName 을 만들 임시 파일, 다음 삭제하고 다시 만들이 파일이 디렉토리로 대신했다.

참고:링크 작동하지 않았,복사/붙여 넣기: http://msdn.microsoft.com/en-us/library/aa364991(VS.85).aspx

결합한 답변에서@아담-라 pix0r 이 최고의 작품을 이럴:


using System.IO;

string path = Path.GetTempPath() + Path.GetRandomFileName();

while (Directory.Exists(path)) 
  path = Path.GetTempPath() + Path.GetRandomFileName();

File.Delete(path);
Directory.CreateDirectory(path);

장점 사용하는 시스템입니다.IO.경로에 있습니다.GetTempFileName 이 될 것이라는 파일에 사용자의 로컬(즉,로밍되지 않는)경로에 있습니다.이것은 정확하게 당신이 원하는 것 그것이 사용 권한과 보안을 이유입니다.

Dim NewFolder = System.IO.Directory.CreateDirectory(IO.Path.Combine(IO.Path.GetTempPath, Guid.NewGuid.ToString))

@JonathanWright 건 CreateDirectory 실패할 것이 있을 때는 이미 폴더에 있습니다.면 디렉토리에 있습니다.CreateDirectory 그것은 말'이 객체를 반환하는지 여부에 관계없이 디렉토리에서 지정한 경로에 이미 존재합니다.' 당신을 의미하지 않는 검출하는 폴더를 만든 사인이 존재하고 실제로 만들기.

내가 좋아하 CreateDirectoryTransacted()에 의해 제안@DanielTrebbien 하지만 이 기능은 사용되지 않습니다.

유일한 솔루션이 나오는 사용하는 c api 를 호출'CreateDirectory'있는 그대로 오류인 경우 폴더가 존재하는 경우에 당신이 정말로 확실할 필요가 전체를 커버 레이스 상태입니다.시에는 반드시 뭔가가 다음과 같다:

Private Function GetTempFolder() As String
    Dim folder As String
    Dim succes as Boolean = false
    Do While not succes
        folder = Path.Combine(Path.GetTempPath, Path.GetRandomFileName)
        success = c_api_create_directory(folder)
    Loop
    Return folder
End Function
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top