PDA

Pogčedajte punu verziju : Long paths in .NET


eraser
13. 08. 2010., 16:19
Imam desktop C# 2008 projekat koji koristi DynaZip komponentu.
Problem je sledeci: Cesto se pojavljuju arhive koje imaju dugacak naziv fajla a isti takav je naziv prvog foldera u arhivi, pa tek onda ide struktura foldera i fajlova koja je sustina same arhive.

Kada pokusavam da izvucem neki fajl iz arhive on se smesta u Win temp folder, npr:
C:\Documents and Settings\test\Local Settings\Temp\Agilent Analytical Data Viewer\1131c4760ff24becac07a5cc2231ac29\1111111111 11111111111111111111111111111111111111111111111111 1111_19971025-002104-HPWBM187-LEO-1046-Administrator-DEMO-DEMODADN.d\CHROMS\00000001.WMF

tako da dobijem cesto putanje koje su duze od 260 karaktera, sto je Win ogranicenje i imam razne probleme kod prikaza fajlova.
Da neko nije imao slican problem ili neko ima ideju kako bih mogao da prevazidjem problem. Napomena da se zip fajlovi kreiraju ko zna gde i da nije moguce uticati na strukturu kako se kreira ime arhive.
Program radi tako sto ne unzipuje celu arhivu vec po potrebi ucita fajl u temp folder i prikaze ga odatle.
Nadam se da sam uspeo da objasnim u cemu je problem.

LiquidBrain
13. 08. 2010., 17:17
Probaj da promenish temp folder tako da stavish da bude u recimo C:\TMP...

Tu cesh da ustedish na jedno cetrdesetak karaktera... :)

mileusna
13. 08. 2010., 18:34
Ne znam koliko pomaže, ali svaki long filename bi trebao da ima i svoj ekvivalent u skraćenom obliku. Skraćene nazive fajlova iz komandne linije možeš da dobiješ kada otkucaš dir /X

C:\PROGRA~1>dir /X
Volume in drive C is System
Volume Serial Number is 8A14-5F09

Directory of C:\PROGRA~1

14.07.2009 07:32 <DIR> REFERE~1 Reference Assemblies
16.11.2009 13:59 <DIR> TORTOI~1 TortoiseSVN
14.07.2009 07:37 <DIR> WINDOW~3 Windows Defender
14.07.2009 09:47 <DIR> WI0FCF~1 Windows Journal
12.05.2010 20:26 <DIR> WINDOW~1 Windows Mail
08.11.2009 17:44 <DIR> WI54FB~1 Windows Media Player
14.07.2009 07:32 <DIR> WINDOW~2 Windows NT


Znači npr. prema ovom gore listingu ti bi sa pathom C:\PROGRA~1\WI54FB~1\ dospeo u folder C:\Program Files\Windows Media Player\ sa velikom uštedom na broju karaktera.

Ne znam konkretno da li ti ovo pomaže pošto ne razumem problem u potpunosti. Mada ako ovaj short file name može da se izvuče preko .NET frejmvorka, verujem da bi ti to sve rešilo.

Edit: Izgleda da može iz .NET (http://www.c-sharpcorner.com/UploadFile/crajesh1981/RajeshPage103142006044841AM/RajeshPage1.aspx) direktnim pozivom API funkcije GetShortPathName.

eraser
20. 08. 2010., 09:34
Mada ako ovaj short file name može da se izvuče preko .NET frejmvorka, verujem da bi ti to sve rešilo.

Ako se fji. File.Exist() prosledi ShortFileNamePath izgleda da ga ona ipak konvertuje u LongName tako da fajl ne bude prepoznat da postoji.
Nekako sam uspeo da prepravim app da koriscenjem UNICODE verzija odredjenih API fja. uspe da se izbori sa dugim putanjama (tako se maksimalna duzina povecava na 32000 karaktera)

[DllImport("kernel32", CharSet = CharSet.Unicode)]
public static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData);

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
static extern bool CopyFile(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);