Làm thế nào để lấy đường dẫn tương đối của tệp trong studio trực quan?


82

Tôi đang cố gắng lấy đường dẫn của tệp hình ảnh mà tôi đã thêm vào trình khám phá giải pháp trong Visual Studio, nhưng tôi không thể nhận được đường dẫn tương đối của hình ảnh đó. H là cấu trúc tệp của dự án của tôi:

/ BulutDepoProject
    / FolderIcon
        Folder.ico
        Main.cs

Tôi có thể lấy hình ảnh như thế này:

"C:\\Users\\Tolga\\Desktop\\BulutDepo\\BulutDepoProject\\FolderIcon\\Folder.ico" 

Nhưng tôi có thể có được nó với một số thứ như:

"~\\FolderIcon\\Folder.ico"

Tôi đoán tôi không biết cú pháp chính xác của nó vì vậy tôi không thể tìm nạp hình ảnh. :(


Bạn nên kiểm tra này => stackoverflow.com/questions/6895457/...
MarcD

Câu trả lời:


54

Trong trường hợp bạn muốn sử dụng bất kỳ loại tệp bên ngoài nào, chắc chắn có một cách để đặt chúng vào một thư mục trong dự án của bạn, nhưng không hợp lệ bằng việc lấy chúng từ tài nguyên. Trong một dự án Visual Studio thông thường, bạn nên có một Resources.resxtệp trong Propertiesphần này, nếu không, bạn có thể dễ dàng thêm Resource.resxtệp của riêng mình . Và thêm bất kỳ loại tệp nào vào đó, bạn có thể xem hướng dẫn thêm tệp tài nguyên vào dự án của mình tại đây .

Sau khi có các tệp tài nguyên trong dự án của bạn, việc gọi chúng dễ dàng như sau:

var myIcon = Resources.MyIconFile;

Tất nhiên bạn nên thêm using Propertiescâu lệnh như sau:

using <namespace>.Properties;

4
@ christo8989 OP là về một tệp hình ảnh , readonlydù sao cũng sẽ là tệp hình ảnh , vì vậy ....
Jesse Chisholm

37

Tôi đến muộn một chút và tôi không chắc liệu đây có phải là thứ bạn đang tìm kiếm hay không, nhưng tôi nghĩ tôi sẽ thêm nó vào phòng trường hợp người khác thấy nó hữu ích.

Giả sử đây là cấu trúc tệp của bạn:

/BulutDepoProject
    /bin
        Main.exe
    /FolderIcon
        Folder.ico
        Main.cs

Bạn cần phải viết đường dẫn của bạn liên quan đến Main.exetệp. Vì vậy, bạn muốn truy cập Folder.ico, Main.csbạn có thể sử dụng:

String path = "..\\FolderIcon\\Folder.ico"

Điều đó dường như làm việc cho tôi!


1
Đây là giải pháp tốt hơn trong trường hợp của tôi vì tệp đang được tham chiếu được quản lý bởi một dự án khác trong Giải pháp. Không phải cú pháp cũng hỗ trợ một dấu chấm? string path = ".\\FileName.txt"
Christopher J. Grace

1
Đây là một giải pháp tồi tệ, Không sử dụng nó ... điều này chỉ hoạt động vì trong kịch bản "Gỡ lỗi", thư mục công việc hiện tại của bạn <Project>/Debug do đó nó hoạt động cho môi trường Gỡ lỗi VS. Nhưng nếu bạn thoát khỏi IDE ... hoặc chạy EXE từ một Thư mục làm việc khác, nó chắc chắn sẽ bị hỏng.
Tomer W

25

Bỏ qua "~ \":

var path = @"FolderIcon\Folder.ico";

~\không có ý nghĩa gì về hệ thống tệp. Nơi duy nhất tôi thấy nó được sử dụng chính xác là trong một ứng dụng web, nơi ASP.NET thay thế dấu ngã bằng đường dẫn tuyệt đối đến thư mục gốc của ứng dụng.

Bạn thường có thể giả định rằng các đường dẫn liên quan đến thư mục chứa EXE. Ngoài ra, hãy đảm bảo rằng hình ảnh được chỉ định là "nội dung" và "sao chép nếu mới hơn" / "sao chép luôn luôn" trong tab thuộc tính trong Visual Studio.


Trong unix / linux, '~' là từ đồng nghĩa với "thư mục chính".
Nyerguds

1
@Nyerguds có. Tuy nhiên, dấu gạch chéo là sai cách và câu hỏi này được gắn thẻ “Visual Studio” không thực sự tương thích với Linux, đặc biệt là vào năm 2012 khi câu hỏi này được đăng.
3Dave

"Bạn thường có thể giả định rằng các đường dẫn liên quan đến thư mục chứa EXE" << Rất không đúng! khi bạn nhấp đúp vào EXE trong Windows, Thư mục Làm việc là vị trí riêng tư của Người dùng chứ KHÔNG phải vị trí Thực thi!
Tomer W

@TomerW Có nhiều cách để chạy tệp thực thi ngoài việc nhấp đúp vào tệp.
3Dave

Đúng, Tuy nhiên ... một ứng dụng sẽ hoạt động theo mọi cách, bao gồm cả Dblclick là ứng dụng phổ biến nhất, tôi nghĩ.
Tomer W

17

Tôi cũng gặp vấn đề tương tự và tôi đã có thể vượt qua nó. Vì vậy, hãy để tôi giải thích các bước tôi đã áp dụng. Tôi sẽ giải thích nó theo kịch bản của bạn.

Theo phương pháp của tôi, chúng ta cần sử dụng lớp 'Path' và lớp 'Assembly' để có được đường dẫn tương đối.

Vì vậy, trước tiên hãy nhập System.IO và System.Reflection bằng cách sử dụng các câu lệnh.

Sau đó gõ dòng mã dưới đây.

        var outPutDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly(). CodeBase);

Trên thực tế, dòng đã cho ở trên lưu trữ đường dẫn của thư mục đầu ra của dự án của bạn. (Ở đây thư mục 'đầu ra' đề cập đến thư mục Gỡ lỗi trong dự án của bạn).

Bây giờ sao chép thư mục FolderIcon của bạn vào thư mục Gỡ lỗi. Sau đó gõ Dòng dưới đây cho sẵn.

var iconPath = Path.Combine(outPutDirectory, "FolderIcon\\Folder.ico");

Bây giờ biến 'iconPath' này chứa toàn bộ đường dẫn của Folder.ico của bạn. Tất cả những gì bạn phải làm là lưu trữ nó trong một biến chuỗi. Sử dụng dòng mã dưới đây cho điều đó.

string icon_path = new Uri(iconPath ).LocalPath;

Bây giờ bạn có thể sử dụng biến chuỗi icon_path này làm đường dẫn liên quan đến biểu tượng.

Cảm ơn.


1
tại sao file:ở phía trước của con đường
Kolob Canyon

2
@KolobCanyon Đó là vì .NET Assemblies có thể chạy từ nhiều URI khác nhau và không chỉ từ Đĩa (Đối tượng COM, RPC, v.v.) Bạn có thể sử dụng Assembly.GetExecutingAssembly().Locationnếu bạn chắc chắn bạn đang xử lý tệp (EXE / DLL)
Tomer W

3

Tôi nghĩ sử dụng cái này sẽ dễ nhất

new Uri("pack://application:,,/FolderIcon/" + youImageICO);

hoặc mã này sẽ hoạt động trên bất kỳ máy nào nếu thư mục của bạn nằm trong dự án gốc của bạn nếu bạn muốn thay đổi nó ... chỉ cần thay đổi phần này @ ".. \"

public static string bingPathToAppDir(string localPath)
{
    string currentDir = Environment.CurrentDirectory;
    DirectoryInfo directory = new DirectoryInfo(
        Path.GetFullPath(Path.Combine(currentDir, @"..\..\" + localPath)));
    return directory.ToString();
}

2

Trong Visual Studio, vui lòng nhấp vào tệp 'Folder.ico' trong ngăn Giải pháp Explorer. Sau đó, bạn sẽ thấy ngăn Thuộc tính. Thay đổi hành vi 'Sao chép vào Thư mục đầu ra' thành 'Sao chép nếu mới hơn'. Điều này sẽ làm cho Visual Studio sao chép tệp vào thư mục thùng đầu ra.

Bây giờ để lấy đường dẫn tệp bằng đường dẫn tương đối, chỉ cần gõ:

string pathToIcoFile = AppDomain.CurrentDomain.BaseDirectory + "//FolderIcon//Folder.ico";

Hy vọng rằng đã giúp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.