Diskuze: C# - cesta k souboru na serveru
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 26 zpráv z 26.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Nikdo tě tu střílet nebude, ale budeme na tebe mluvit...
programátorštinou.
Tipuju, že to, co hledáš, se označuje UNC path: string
fileToCopy=@"\\ServerName\ShareName\AP.xlsx".
Jasný já čekal nějakou jízlivou odpověď jako na jiných fórech.
Bohužel mi to stále nechce najít složku a skáče do "else". Co teď?
Mám to teď takto(pro věrohodnější testování to sdílím na pracovní pc abych se dostal na server):
using System;
using _Excel = Microsoft.Office.Interop.Excel;
using System.Diagnostics;
namespace Excel_skript_Copy
{
class Program
{
private static void Main(string[] args)
{
string filetocopy=@"\\SERVER\\posta\\Akční plán.xlsx"; //C:\\Users\\Fudi7\\OneDrive\\Plocha\\Moje\\Práce\\Program\\Test\\Original\\AP.xlsx
string newLocation="C:\\Users\\Blaha\\Desktop\\NOV"; //C:\\Users\\Fudi7\\OneDrive\\Plocha\\Moje\\Práce\\Program\\Test\\Spousteci\\AP.xlsx
string folderlocation="C:\\Users\\Blaha\\Desktop\\NOV\\Akční plán.xlsx"; //C:\\Users\\Fudi7\\OneDrive\\Plocha\\Moje\\Práce\\Program\\Test\\Original
foreach (var process in Process.GetProcessesByName("EXCEL"))
{
process.Kill();
Console.WriteLine("Zavřeno");
System.Threading.Thread.Sleep(5000);
}
if (System.IO.Directory.Exists(folderlocation))
{
if (System.IO.File.Exists(filetocopy))
{
System.IO.File.Copy(filetocopy, newLocation, true);
Console.WriteLine("Zkopírováno");
Console.WriteLine("Spouštím");
{
var excelApp = new _Excel.Application();
excelApp.Visible = true;
_Excel.Workbooks Books = excelApp.Workbooks;
_Excel.Workbook sheet = Books.Open(newLocation);
Console.WriteLine("FullScreen");
System.Threading.Thread.Sleep(2000);
excelApp.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMaximized;
excelApp.CommandBars.ExecuteMso ("HideRibbon");
}
}
else
{
Console.WriteLine("Soubor neexistuje");
Console.ReadKey();
}
}
else
{
Console.WriteLine("Složka neexistuje");
Console.ReadKey();
}
}
}
}
Nejsem si úplně jistý, jestli bylo dvojí escapování úmyslem… (zavináč a zdvojení zpětných lomítek)
Teď teda té "programátorštině" nerozumím , zkusil bys mi polopaticky
vysvětlit prosím, co si myslel?
Zpětné lomítko (\
) se používá na zapsání speciálních
znaků, takže pokud chceš zapsat zpětné lomítko, musíš napsat dvě. Pokud
ale před string dáš zavináč, zpětné lomítko je už pouze zpětným
lomítkem, takže dvě za sebou zůstanou dvěma za sebou… a to by mohlo
způsobit, že soubor s danou cestou neexistuje.
No ale ta cesta v sobě má standardně dvě lomítka, takže je mám dát
pryč? Teď jsem vyzkoušel všechny varianty , ale furt nic. Nechápu, jsem
docela v pasti.
Tohle si myslel, že jo?
string filetocopy = @"\\SERVER\posta\Akční plán.xlsx";
Ano, myslel jsem tohle.
No ale ta cesta v sobě má standardně dvě lomítka
Jestli to teda byl záměr, omlouvám se za vyvolávání diskuze tímto směrem.
V pohodě, měl si pravdu bylo to špatně, dvě lomítka jsou jen na začátku. Dokonce jsem odhalil jednu úplně stupidní chybu, prohodil jsem NewLocation a FolderLocation. Nicméně to nemění nic na tom, že mi to stejně nechce najít ten soubor na serveru.
Co jsem vyčetl na netu, tak můžu mít přístup jen k souboru, ale ne k
serveru, což asi bude pravda. Podle toho co jsem našel, tak musím zjistit na
jakém disku toho serveru je ten soubor (ten disk tam zapsat jako "\C$\"), to
ale nevím jak. Asi se budu muset vloupat do serverovny a kouknout se přímo do
pc .
Jedna věc je, že musíš znát umístění souboru (veřejné umístění)
adresa může být např.
@"\\192.144.1.14\nazev_slozky\soubor.xlsx"
nebo
@"\\ZASTUPNY_NAZEV_SERVERU\nazev_slozky\soubor.xlsx"
nebo bez @.:
"\\\\ZASTUPNY_NAZEV_SERVERU\\nazev_slozky\\soubor.xlsx").
A druhá věc je, že ti správce serveru musí přidělit práva pro zápis a čtení do příslušné složky.
Tak jak psal @Honz4, musíš mít práva. Bez nich se k souboru nedostaneš (pokud ano, pošli use case na dodavatele serverového OS a žádej odměnu. Pak dej výpověď neboť jsi na špatné pozici.)
Ověř, že máš práva. A to tak, že si otevřeš nějaký filemanager a zadáš, do něj, cestu \\SERVER\posta. Zkus si pak ručně zkopírovat soubor "Akční plán.xlsx" na lokální disk.
Skryté sdílené adresáře (viz C$) fungují, ale stále potřebuješ práva.
To je právě to, mě to normálně funguje. Do \\SERVER\Posta\ se dostanu přes cokoliv, s tou tabulkou si můžu dělat co chci. Tak mi právě nejde do hlavy..
Takže problém máš s methodou System.IO.Directory.Exists, nikoliv s "Cesta k souboru na serveru", je to tak?
Na inetu jsem našel podobné problémy:
https://social.msdn.microsoft.com/…network-path?…
https://social.msdn.microsoft.com/…etwork-drive?…
Osobně bych zkusil ten soubor rovnou zkopírovat, bez kontroly jeho existence. Samozřejmě si musíš ošetřit vyjímky/exceptions.
Myslím, že tu vymýšlíte znovu kolo.
Na tohle použij tabulku v google dokumentech, nasdílej to pouze vedoucím.
Pokud někdo provádí změny, hned se zobrazují i ostatním.
Vyzkoušej si to...myslím si, že to je přesně co, co hledáš a "téměř" bez práce.
A pak to jen otevři v prohlížeči na připojeném PC k tomu monitoru/televizi...
Popravdě, já vím. Ale tady prostě narazím na problém mezi židlí a monitorem. Jsem rád že jsem je naučil pracovat alespoň s Excelem. Bohužel v malé kovovýrobě, je to se IT znalostí fakt mizerné. Zkusím to nějak projít, jestli by to nebylo jednodušší.
Můžu mí během úprav tu sdílenou google tabulku otevřenou? Aktualizuje se hnedka po zápisu?
Další věcí je, že mi zmizí polovina formátování, takže to není úplně ono.
Aktualizuje se to bez uložení, každých cca 5s. Myslím si, že by šlo naklikat i jednoduchý formuláře aby to měli jednodušší...
Teď uplně nerozumím těm jednoduchým formulářům. Co si tím myslel?
Myslíš, že bys mi mohl napsat kód, jak to myslíš. Jak si psal, zkusil jsem to, ale chybí mi ty výjimky.
Nejprve otestuj přístup k souboru a vytvoření kopie:
using System;
using System.IO;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string src_filename = "\\\\SERVER\\posta\\Akční plán.xlsx";
string des_directory = "C:\\Users\\Blaha\\Desktop\\NOV";
string des_filename= "C:\\Users\\Blaha\\Desktop\\NOV\\Akční plán.xlsx";
try
{
if (!Directory.Exists(des_directory)) Directory.CreateDirectory(des_directory);
File.Copy(src_filename, des_filename, true);
Console.WriteLine("Hotovo"); //pokud k chybě nedojde vypíše Hotovo
}
catch(Exception ex)
{
Console.WriteLine(ex.Message); //zachytí první chybu a vypíše ji
}
Console.WriteLine("\nStiskem klávesy se aplikace ukončí.");
Console.ReadKey();
}
}
}
Pokud ti ohlásí chybu, tak sem opiš její přesné znění!
Použij tyto cesty:
string src_filename = "\\\\SERVER\\posta\\Akční plán.xlsx";
string des_directory = "C:\\Users\\Blaha\\Desktop\\NOV";
string des_filename= "C:\\Users\\Blaha\\Desktop\\NOV\\Akční
plán.xlsx";
ty původní obsahují neviditelné neplatné znaky! Teď jen
záleží máš ty cesty opravdu správně.
Děkuji, to je přesně ono (taková blbost), ty chyby tam jsou asi jak jsem z widlí kopíroval
cestu. Takže příště buď nejprve nakopírovat do pozn. bloku a odmazat
neviditelné znaky a až potom do kódu. Nebo to napsat ručně. Jinak ten tvůj
kód my po zadání opravených cest vyhodil "Hotovo".
Ještě jednou děkuji. Už to maká jak jsem si představoval.
Ty stringy se dají zjednodušit, když na začátek dáš zavináč:
string src_filename = @"\\SERVER\posta\Akční plán.xlsx";
Zobrazeno 26 zpráv z 26.