2012-05-07 40 views
13

Tôi đang tạo một StreamWriter bằng đường dẫn tương đối. Nhưng tệp không xuất hiện. Để khắc phục sự cố, tôi muốn kiểm tra xem đường dẫn đầy đủ có phải là những gì tôi đang mong đợi hay không. Vì vậy, có một ví dụ StreamWriter, làm cách nào tôi có thể nhận được đường dẫn đầy đủ của tệp mà nó sẽ ghi vào?Cách lấy đường dẫn đầy đủ của StreamWriter

string fileName = "relative/path.txt" 
StreamWriter sw= new StreamWriter(fileName); 
// What is the full path of 'sw'? 
+1

Bạn đã cân nhắc rằng khi bạn chạy ứng dụng của mình ion bên trong visual studio thư mục hiện tại là bin/debug hoặc bin/release? – Steve

+0

@banging done done done – javapowered

+0

@Steve vâng tôi đang tìm kiếm các tập tin trong thư mục bin/debug/release .... không có ở đó và đó là lý do tại sao tôi muốn có được đường dẫn đầy đủ theo chương trình. Để so sánh nếu tôi đang tìm kiếm trong đúng thư mục – javapowered

Trả lời

11

Để có đường dẫn đầy đủ từ đường dẫn tương đối, hãy sử dụng phương pháp Path.GetFullPath.

Ví dụ:

string fileName = "relative/path.txt"; 
string fullPath = Path.GetFullPath(fileName); 
1

Có thể là thư mục 'tương đối' không tồn tại. Hoặc là tạo thủ công. Hoặc tạo ra nó lập trình như sau

string fileName = @"relative\path.txt"; 
fileName = Path.GetFullPath(fileName); 
Directory.CreateDirectory(Path.GetDirectoryName(fileName)); 

StreamWriter sw= new StreamWriter(fileName, true); 
37

Trong phiên bản của tôi về khuôn khổ, điều này dường như làm việc: (. Tìm thấy bằng cách gỡ lỗi)

string fullPath = ((FileStream)(streamWriter.BaseStream)).Name; 

+3

Cảm ơn, đây chính xác là những gì tôi đang tìm kiếm! –

+3

Chính xác loại câu trả lời phù hợp với tiêu đề câu hỏi. Ý của bạn có phải là tìm thấy bởi 'nội tâm '...? –

-2
var fstream = sw.BaseStream as System.IO.FileStream; 
    if (fstream != null) 
    Console.WriteLine(GetAbsolutePathByHandle(fstream.SafeFileHandle)); 


[DllImport("ntdll.dll", CharSet = CharSet.Auto)] 
private static extern int NtQueryObject(SafeFileHandle handle, int objectInformationClass, IntPtr buffer, int StructSize, out int returnLength); 

static string GetAbsolutePathByHandle(SafeFileHandle handle) 
{ 
    var size = 1024; 
    var buffer = Marshal.AllocCoTaskMem(size); 
    try 
    { 
    int retSize; 
    var res = NtQueryObject(handle, 1, buffer, size, out retSize); 
    if (res == -1073741820) 
    { 
     Marshal.FreeCoTaskMem(buffer); 
     size = retSize; 
     Marshal.AllocCoTaskMem(size); 
     res = NtQueryObject(handle, 1, buffer, size, out retSize); 
    } 
    if (res != 0) 
     throw new Exception(res.ToString()); 
    var builder = new StringBuilder(); 
    for (int i = 4 + (Environment.Is64BitProcess ? 12 : 4); i < retSize - 2; i += 2) 
    { 
     builder.Append((char)Marshal.ReadInt16(buffer, i)); 
    } 
    return builder.ToString(); 
    } 
    finally 
    { 
    Marshal.FreeCoTaskMem(buffer); 
    } 
} 

Output:

\Device\HarddiskVolume2\bla-bla\relative\path.txt 
Các vấn đề liên quan