Geek tričko zdarma Geek tričko zdarma
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde

Diskuze: C# - cesta k souboru na serveru

Aktivity (4)
Avatar
Jan Blaha
Člen
Avatar
Jan Blaha:18. srpna 12:09

Potřebuji načíst soubor .xlsx ze serveru, ale nenapadá mě jakým způsobem.

Zkusil jsem: Bohužel nejsem programátor (jsem strojař :-) ), mám pouze naprosté základy ještě ze střední. Takže mě prosím hnedka nezastřelte :-) .

Dal jsem dohromady více méně funkční kód, ale bohužel funguje pouze při testu na mém PC, kde zdrojový soubor beru z místního disku. Excel to zavře, překopíruje, otevře a maximalizuje. Ale nevím jak dál. (cesty k souborům a k složkám samozřejmě měním dle daného počítače, to bych chtěl taky upravit, abych po prvním spuštění musel nastavit cesty ručně a pak aby to bylo automatické, ale je to až druhotné). Nějakým způsobem musím nastavit cestu k souboru na serveru, abych ho mohl překopírovat, ale nevím jak.

Aktuálně můj zdrojový kód vypadá takto:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Microsoft.Office.Interop;
using _Excel = Microsoft.Office.Interop.Excel;
using System.Diagnostics;
using Microsoft.Office.Interop.Excel;

namespace Excel_skript_Copy
{
    class Program
    {
        static void Main(string[] args)
        {
            String filetocopy = "C:\\Users\\Fudi7\\OneDrive\\Plocha\\Moje\\Práce\\Program\\Test\\Original\\AP.xlsx";
            String newLocation = "C:\\Users\\Fudi7\\OneDrive\\Plocha\\Moje\\Práce\\Program\\Test\\Spousteci\\AP.xlsx";
            String folderlocation = "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();
            }
        }

    }

}

Chci docílit: V práci mám za úkol spravovat tabulku úkolů, která je umístěna ve složce na společném firemním serveru. Do oné tabulky může zapisovat každý vedoucí střediska problém, který má, tak aby byl sdílen mezi všechny vedoucí (nějaká lepší informovanost). Problém nastal tehdy, když šéf chtěl, aby tabulka byla promítnuta "živě" na velké televizi (na hloupé televizi s hdmi, mám na to nulový rozpočet, proto to "patlám" sám). Náš externí IT technik mi nebyl schopen poradit, takže jsem musel trošku popřemýšlet a napadlo mě že k televizi připojím počítač a otevřu ji přímo na televizi. Abych aktualizovanou tabulku nemusel otevírat ručně napadlo mě vytvořit "aplikaci" nebo "skript" (nevím jak to nazvat), která by každou hodinu (to bych naplánoval přes Windows) zavřela otevřenou aplikaci Excel, překopírovala by aktuální tabulku ze serveru (aby do něj šlo dále zapisovat) na místo na disku a otevřela ji v maximalizovaném okně.

 
Odpovědět 18. srpna 12:09
Avatar
zelvicek
Člen
Avatar
Odpovídá na Jan Blaha
zelvicek:18. srpna 16:11

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 [email protected]"\\Ser­verName\Share­Name\AP.xlsx".

 
Nahoru Odpovědět 18. srpna 16:11
Avatar
Jan Blaha
Člen
Avatar
Jan Blaha:18. srpna 16:37

Jasný já čekal nějakou jízlivou odpověď :-D 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();
            }
        }

    }

}
 
Nahoru Odpovědět 18. srpna 16:37
Avatar
Andy Scheuchzer:18. srpna 16:54

Nejsem si úplně jistý, jestli bylo dvojí escapování úmyslem… (zavináč a zdvojení zpětných lomítek)

Nahoru Odpovědět 18. srpna 16:54
Člověk, co si myslí, že snědl všechnu moudrost světa, i když tomu tak není.
Avatar
Jan Blaha
Člen
Avatar
Odpovídá na Andy Scheuchzer
Jan Blaha:18. srpna 18:33

Teď teda té "programátorštině" nerozumím :-), zkusil bys mi polopaticky vysvětlit prosím, co si myslel?

Editováno 18. srpna 18:35
 
Nahoru Odpovědět 18. srpna 18:33
Avatar
Odpovídá na Jan Blaha
Andy Scheuchzer:18. srpna 19:06

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.

Nahoru Odpovědět 18. srpna 19:06
Člověk, co si myslí, že snědl všechnu moudrost světa, i když tomu tak není.
Avatar
Jan Blaha
Člen
Avatar
Odpovídá na Andy Scheuchzer
Jan Blaha:18. srpna 19:24

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.

Editováno 18. srpna 19:27
 
Nahoru Odpovědět 18. srpna 19:24
Avatar
Jan Blaha
Člen
Avatar
Odpovídá na Andy Scheuchzer
Jan Blaha:18. srpna 19:33

Tohle si myslel, že jo?

string filetocopy = @"\\SERVER\posta\Akční plán.xlsx";
 
Nahoru Odpovědět 18. srpna 19:33
Avatar
Odpovídá na Jan Blaha
Andy Scheuchzer:18. srpna 19:52

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.

Nahoru Odpovědět 18. srpna 19:52
Člověk, co si myslí, že snědl všechnu moudrost světa, i když tomu tak není.
Avatar
Jan Blaha
Člen
Avatar
Odpovídá na Andy Scheuchzer
Jan Blaha:18. srpna 20:03

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 :-D .

 
Nahoru Odpovědět 18. srpna 20:03
Avatar
HONZ4
Člen
Avatar
Odpovídá na Jan Blaha
HONZ4:18. srpna 22:27

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_sloz­ky\soubor.xlsx"
nebo
@"\\ZASTUPNY_NA­ZEV_SERVERU\na­zev_slozky\sou­bor.xlsx"
nebo bez @.:
"\\\\ZASTUPNY_NA­ZEV_SERVERU\\na­zev_slozky\\sou­bor.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.

 
Nahoru Odpovědět 18. srpna 22:27
Avatar
zelvicek
Člen
Avatar
Odpovídá na Jan Blaha
zelvicek:19. srpna 7:08

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.

 
Nahoru Odpovědět 19. srpna 7:08
Avatar
Jan Blaha
Člen
Avatar
Odpovídá na zelvicek
Jan Blaha:19. srpna 7:27

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..

 
Nahoru Odpovědět 19. srpna 7:27
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
zelvicek
Člen
Avatar
Odpovídá na Jan Blaha
zelvicek:19. srpna 10:05

Takže problém máš s methodou System.IO.Direc­tory.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.

 
Nahoru Odpovědět 19. srpna 10:05
Avatar
Odpovídá na Jan Blaha
don.jarducius:19. srpna 10:52

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.

Nahoru Odpovědět 19. srpna 10:52
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Odpovídá na Jan Blaha
don.jarducius:19. srpna 10:53

A pak to jen otevři v prohlížeči na připojeném PC k tomu monitoru/tele­vizi...

Nahoru Odpovědět 19. srpna 10:53
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Jan Blaha
Člen
Avatar
Odpovídá na don.jarducius
Jan Blaha:19. srpna 11:58

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?

 
Nahoru Odpovědět 19. srpna 11:58
Avatar
Jan Blaha
Člen
Avatar
Odpovídá na don.jarducius
Jan Blaha:19. srpna 12:10

Další věcí je, že mi zmizí polovina formátování, takže to není úplně ono.

 
Nahoru Odpovědět 19. srpna 12:10
Avatar
Odpovídá na Jan Blaha
don.jarducius:19. srpna 12:35

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šší...

Nahoru Odpovědět 19. srpna 12:35
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Jan Blaha
Člen
Avatar
Odpovídá na don.jarducius
Jan Blaha:19. srpna 12:48

Teď uplně nerozumím těm jednoduchým formulářům. Co si tím myslel?

 
Nahoru Odpovědět 19. srpna 12:48
Avatar
Odpovídá na Jan Blaha
don.jarducius:19. srpna 13:59

Použít google forms...

Nahoru Odpovědět 19. srpna 13:59
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Jan Blaha
Člen
Avatar
Odpovídá na zelvicek
Jan Blaha:19. srpna 21:24

Myslíš, že bys mi mohl napsat kód, jak to myslíš. Jak si psal, zkusil jsem to, ale chybí mi ty výjimky.

Editováno 19. srpna 21:24
 
Nahoru Odpovědět 19. srpna 21:24
Avatar
HONZ4
Člen
Avatar
Odpovídá na Jan Blaha
HONZ4:19. srpna 22:40

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í!

 
Nahoru Odpovědět 19. srpna 22:40
Avatar
HONZ4
Člen
Avatar
HONZ4:19. srpna 22:58

Použij tyto cesty:
string src_filename = "\\\\SERVER\\pos­ta\\Akční plán.xlsx";
string des_directory = "C:\\Users\\Bla­ha\\Desktop\\NOV";
string des_filename= "C:\\Users\\Bla­ha\\Desktop\\NOV\\Ak­ční plán.xlsx";
ty původní obsahují neviditelné neplatné znaky! Teď jen záleží máš ty cesty opravdu správně.

Editováno 19. srpna 23:00
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 19. srpna 22:58
Avatar
Jan Blaha
Člen
Avatar
Odpovídá na HONZ4
Jan Blaha:20. srpna 6:38

Děkuji, to je přesně ono :-D (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.

Editováno 20. srpna 6:39
 
Nahoru Odpovědět 20. srpna 6:38
Avatar
Odpovídá na Jan Blaha
Michal Štěpánek:20. srpna 8:50

Ty stringy se dají zjednodušit, když na začátek dáš zavináč:

string src_filename = @"\\SERVER\posta\Akční plán.xlsx";
Nahoru Odpovědět 20. srpna 8:50
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 26 zpráv z 26.