Visual Studio'da bir dosyanın göreceli yolu nasıl alınır?


82

Visual Studio'da çözüm gezginine eklediğim bir görüntü dosyasının yolunu almaya çalışıyorum, ancak o görüntünün göreceli yolunu alamadım. H, projemin dosya yapısı:

/ BulutDepoProject
    / FolderIcon
        Folder.ico
        Main.cs

Görüntüyü şöyle elde edebilirim:

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

Ama şunun gibi bir şeyle alabilmeliyim:

"~\\FolderIcon\\Folder.ico"

Sanırım tam sözdizimini bilmediğim için resmi getiremiyorum. :(


Bunu kontrol etmelisiniz => stackoverflow.com/questions/6895457/…
MarcD

Yanıtlar:


54

Herhangi bir harici dosya kullanmak istediğinizde, onları projenizdeki bir klasöre koymanın kesinlikle bir yolu vardır, ancak bunları kaynaklardan almak kadar geçerli değildir. Normal bir Visual Studio projesinde, bölümün Resources.resxaltında bir dosyanız olmalıdır Properties, yoksa kendi Resource.resxdosyanızı kolayca ekleyebilirsiniz . Ve içine her türlü dosyayı ekleyin, buradan projenize kaynak dosyaları eklemek için izlenecek yollara ulaşabilirsiniz .

Projenizde kaynak dosyalara sahip olduktan sonra, bunları aramak şu kadar kolaydır:

var myIcon = Resources.MyIconFile;

Elbette şu using Propertiesifadeyi eklemelisiniz :

using <namespace>.Properties;

4
@ christo8989 OP, her halükarda olacak bir görüntü dosyası hakkında readonly, yani ....
Jesse Chisholm

38

Biraz geciktim ve aradığınız şeyin bu olup olmadığından emin değilim, ancak başka birinin yararlı bulması durumunda onu ekleyeceğimi düşündüm.

Bunun dosya yapınız olduğunu varsayalım:

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

Main.exeDosyaya göre yolunuzu yazmanız gerekir . Yani, erişmek istediğiniz Folder.icosenin içinde, Main.csşunları kullanabilirsiniz:

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

Bu benim için işe yaradı!


1
Başvurulan dosya Çözümdeki başka bir proje tarafından yönetildiği için bu benim durumumda daha iyi bir çözümdür. Sözdizimi tek bir noktayı da desteklemiyor mu? string path = ".\\FileName.txt"
Christopher J. Grace

1
Bu berbat bir çözüm, bunu kullanmayın ... bu sadece "Hata Ayıklama" senaryosunda, mevcut çalışma dizininizin <Project>/Debug VS Hata Ayıklama ortamında çalıştığı için çalışır. Ancak IDE'den çıkarsanız ... veya EXE'yi farklı bir Çalışma Dizininden çalıştırırsanız, kesinlikle bozulacaktır.
Tomer W

25

"~ \" İşaretini atlayın:

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

~\dosya sistemi açısından hiçbir şey ifade etmez. Doğru kullanıldığını gördüğüm tek yer, ASP.NET'in tilde'ı uygulamanın köküne giden mutlak yolla değiştirdiği bir web uygulamasıdır.

Genellikle yolların EXE'nin bulunduğu klasöre göre olduğunu varsayabilirsiniz. Ayrıca, görselin Visual Studio'daki özellikler sekmesinde "içerik" ve "daha yeniyse kopyala" / "her zaman kopyala" olarak belirtildiğinden emin olun.


Unix / linux'ta '~', "ev dizini" ile eşanlamlıdır.
Nyerguds

1
@Nyerguds evet. Bununla birlikte, eğik çizgi yanlış yoldur ve bu soru, özellikle bu soru yayınlandığında 2012'de Linux ile gerçekten uyumlu olmayan "Visual Studio" olarak etiketlenmiştir.
3Dave

"Tipik olarak, yolların EXE'nin bulunduğu klasöre göre olduğunu varsayabilirsiniz" << Hiç Doğru Değil! Windows'ta bir EXE'ye çift tıkladığınızda, Çalışma Dizini Kullanıcının özel konumudur ve Yürütülebilir konum DEĞİLDİR!
Tomer W

@TomerW Bir yürütülebilir dosyayı çalıştırmanın üzerine çift tıklamaktan başka birçok yolu vardır.
3:

Doğru, Yine de ... Bir uygulama, en yaygın olanı Dblclick dahil olmak üzere her şekilde çalışmalıdır.
Tomer W

17

Ben de aynı problemle karşılaştım ve üstesinden gelmeyi başardım. O halde uyguladığım adımları açıklamama izin verin. Senaryonuza göre açıklayacağım.

Yöntemime göre göreceli yolu elde etmek için 'Path' sınıfını ve 'Assembly' sınıfını kullanmamız gerekiyor.

Bu yüzden önce System.IO ve System.Reflection ifadelerini kullanarak içe aktarın.

Ardından aşağıdaki kod satırını yazın.

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

Aslında yukarıda verilen satır, projenizin çıktı dizininin yolunu depolar. (Burada 'output' dizini , projenizin Debug klasörünü ifade eder ).

Şimdi FolderIcon dizininizi Debug klasörüne kopyalayın. Ardından aşağıda verilen Satırı yazın.

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

Şimdi bu 'iconPath' değişkeni, Folder.ico'nuzun tüm yolunu içerir. Tek yapmanız gereken, onu bir dize değişkeninde saklamaktır. Bunun için aşağıdaki kod satırını kullanın.

string icon_path = new Uri(iconPath ).LocalPath;

Artık bu icon_path dize değişkenini simgeye giden göreceli yolunuz olarak kullanabilirsiniz.

Teşekkürler.


1
neden file:yolun önünde
Kolob Kanyon

2
@KolobCanyon Bunun nedeni, .NET Derlemelerinin yalnızca Diskten değil, çeşitli URI'lerden çalıştırılabilmesidir (COM Nesneleri, RPC, Vb ...) Assembly.GetExecutingAssembly().Location dosya (EXE / DLL) ile uğraştığınızdan eminseniz
Tomer W

3

Bence bunu kullanmanın en kolay yolu

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

veya bu kod herhangi bir makinede çalışacaktır, eğer klasörünüz kök projenizdeyse, değiştirmek istiyorsanız ... bu bölümü @ ".. \" değiştirmeniz yeterlidir.

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

2

Visual Studio'da lütfen Solution Explorer bölmesinde 'Folder.ico' dosyasına tıklayın. Ardından Özellikler bölmesini göreceksiniz. 'Çıktı Dizinine Kopyala' davranışını 'Daha yeniyse kopyala' olarak değiştirin. Bu, Visual Studio'nun dosyayı çıktı kutusu dizinine kopyalamasını sağlar.

Şimdi göreli yolu kullanarak dosya yolunu almak için şunu yazın:

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

Umarım yardımcı olmuştur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.