2009-12-07 12 views
7

Tôi đang cố chuyển đường dẫn tệp đầy đủ đến FFMPEG.C# - Cách dễ nhất để phân tích cú pháp tên tệp bằng các khoảng trắng, ví dụ: "C: Test File với spaces.txt"

C:\TestFolder\Input\Friends - Season 6 - Gag Reel.avi 

và nó rõ ràng là không thích thực tế con đường có khoảng trống trong nó, erroring như vậy:

C:\TestFolder\Input\Friends: no such file or directory 

Vì vậy, cách đơn giản nhất để sử dụng tên tập tin với không gian trong đó là những gì? Tôi có nên thay thế tất cả khoảng trắng bằng ký tự ~ hoặc có cách nào tốt hơn không? Tôi đã cố gắng thoát chuỗi bằng các ký tự khác nhau:

@"C:\TestFolder\Input\Friends - Season 6 - Gag Reel.avi"; 

Nhưng điều này không hiệu quả. Có một mẹo để giữ gìn không gian?

+1

"Sử dụng" theo cách nào? Vấn đề với không gian bây giờ là gì? –

+0

Bạn đang cung cấp chương trình nào cho tệp phim? – Woot4Moo

+0

Câu hỏi được cập nhật - xin lỗi guys –

Trả lời

33

Thời gian duy nhất bạn thường sẽ phải thực hiện bất kỳ việc xử lý đặc biệt nào với tên tệp có khoảng trắng là khi bạn chuyển chúng sang các công cụ hoặc định dạng bên ngoài. Nếu bạn đang xây dựng một danh sách đối số cho một thực thi bên ngoài, ví dụ, tất cả các bạn phải làm là trích dẫn đường dẫn:

string path = @"C:\TestFolder\Input\Friends - Season 6 - Gag Reel.avi"; 
ProcessStartInfo psi = new ProcessStartInfo(); 
psi.FileName = "program.exe"; 
psi.Arguments = "\"" + path + "\""; // escape the quotes 

... mà sẽ dẫn đến dòng lệnh này:

chương trình .exe "C: \ TestFolder \ Input \ Friends - Mùa 6 - Gag Reel.avi"

+2

Đưa danh sách đối số cuối cùng bằng "\" "+ đường dẫn +" \ "" đã xử lý. Nooby câu hỏi tôi biết: P –

+0

Làm việc cho tôi quá, cảm ơn .... –

7

System.IO. Path cung cấp một số phương pháp để thao tác tên tệp ...

+0

Cụ thể: http://msdn.microsoft.com/en-us/library/system.io.path.getfilename.aspx – Juliet

4

Nói chung, đường dẫn tập tin thông qua như là đối số trên dòng lệnh yêu cầu đường dẫn đến được bao quanh với dấu ngoặc kép.

Nếu bạn đang nói về việc chấp nhận đường dẫn tệp làm đối số cho chương trình của bạn, thì dễ nhất là yêu cầu người dùng báo giá đường dẫn. Bằng cách đó, đối số args cho phương thức chính của bạn sẽ chứa toàn bộ đường dẫn dưới dạng một chuỗi.

Nếu bạn đang gọi các chương trình khác và chuyển đối số, đường dẫn tệp có dấu cách phải được trích dẫn.

Process p = new Process(); 
p.StartInfo.FileName = "notepad.exe"; 
p.StartInfo.Arguments = string.Format("\"{0}\"", filePath); 
p.Start(); 
5

bạn đang sử dụng lớp FileInfo?

nó chứa (gần như) mọi thứ về tệp, bao gồm thuộc tính và phiên bản tệp và bạn không phải lo lắng về khoảng trắng hoặc các ký tự không mong muốn khác. Miễn là tệp tồn tại, nó hoạt động tốt trên FileInfo.

sử dụng nó như là
FileInfo f = new FileInfo(fullPathEvenWithSpaces);

-2

Tất cả các file có tên đường dẫn ngắn đó là hệ điều hành DOS 8.3 tương thích. Cách duy nhất để lấy tên tập tin đó là GetShortPathName. Lời giải thích tốt nhất mà tôi có thể tìm thấy ở các địa chỉ sau:

http://www.pinvoke.net/default.aspx/kernel32.GetShortPathName

4

Tôi đồng ý với bài viết ở trên. Để dễ dàng hơn, đây là mã bạn cần sử dụng. Trong ý kiến ​​khiêm tốn của tôi, tên tập tin tốt duy nhất là một tên tập tin không gian.

Therefor trong C# mã tôi có điều này:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
static extern uint GetShortPathName(
    [MarshalAs(UnmanagedType.LPTStr)] 
    string lpszLongPath, 
    [MarshalAs(UnmanagedType.LPTStr)] 
    StringBuilder lpszShortPath, 
    uint cchBuffer); 

public static StringBuilder shortNameBuffer = new StringBuilder(256); 
public static string ToShortPathName(string longName) 
{ 
    uint result = GetShortPathName(longName, shortNameBuffer, 256); 
    return shortNameBuffer.ToString(); 
} 

Đó thêm một phương pháp để lớp học của bạn có thể được sử dụng như thế này:

Chuỗi goodFileName = ToShortPathName (evilFileName);

LƯU Ý: Tôi đang sử dụng tính năng này trong giao diện người dùng nên tôi không ngại là không an toàn và sử dụng lại StringBuider. Nếu bạn đang ở trong môi trường đa luồng, hãy đảm bảo kéo phân bổ StringBuilder bên trong phương thức của bạn.

Các vấn đề liên quan